Метод репозитория не найден

Я создал метод запроса к базе данных для всей таблицы соединения в репозитории. Я также прочитал документацию от Как создать собственный репозиторий. Метод работает исправно, но в PhpStorm есть предупреждение желтого цвета.

Method 'findAllDetail' not found.

Как исправить это предупреждение?

Ниже моя сущность:

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass = "App\Repository\InvoiceRepository")
 */
class Invoice
{

а вот и InvoiceRepository:

namespace App\Repository;

use App\Entity\Invoice;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

/**
 * @method Invoice|null find($id, $lockMode = null, $lockVersion = null)
 * @method Invoice|null findOneBy(array $criteria, array $orderBy = null)
 * @method Invoice[]    findAll()
 * @method Invoice[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  */
 class InvoiceRepository extends ServiceEntityRepository
 {
     public function __construct(RegistryInterface $registry)
     {
         parent::__construct($registry, Invoice::class);
     }

     /**
      * @param $value
      * @return Invoice[] Returns an array of Invoice objects
      */
     public function findAllDetail($value)
     {
         $qb = $this->createQueryBuilder('i')
             /* .... */
         ;
         return $qb->execute();
     }

а вот контроллер:

 /**
 * @Route("/invoice/review/{idInvoice}", name = "submitToReview", requirements = {"idInvoice" = "\d+"})
 * @param $idInvoice
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 */
public function submitToReview($idInvoice, \Swift_Mailer $mailer)
{
    $invoice = $this->getDoctrine()->getRepository(Invoice::class)->findAllDetail($idInvoice);
    /* @var $item \App\Entity\Invoice */

Вы используете плагин phpstorm Symfony? Вы используете свой репозиторий как услугу, поэтому получение его напрямую должно работать $this->get(Invoice:class)->findAllDetail($idInvoice);

Iwan Wijaya 24.05.2018 04:38

Желтое предупреждение было удалено, но это не сработало. я получаю сообщение об ошибке "Вы запросили несуществующую службу" App \ Entity \ Invoice "в моем приложении.

Defrian Afdi 24.05.2018 05:51

Вы не передаете объект, а репозиторий в качестве параметра вашему контроллеру - public function submitToReview($idInvoice, \Swift_Mailer $mailer, InvoiceRepository $repository)

M. Kebza 24.05.2018 06:15

Спасибо M.Kebza, ваш ответ исправит мою проблему!

Defrian Afdi 24.05.2018 08:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
4
1 804
4

Ответы 4

Для тех, кто получает такое же предупреждение, ниже я расскажу, как это исправить (на основе комментария М. Кебза). поместите свой репозиторий в контроллер и передайте репозиторий в качестве параметра в контроллере

в контроллере

... 
use App\Repository\InvoiceRepository; 

 /**
  * @Route("/invoice/review/{idInvoice}", name = "submitToReview", requirements = {"idInvoice" = "\d+"})
  * @param $idInvoice
  * @return \Symfony\Component\HttpFoundation\RedirectResponse
  */
 public function submitToReview($idInvoice, \Swift_Mailer $mailer, InvoiceRepository $repository )
 {
     $invoice = $repository->findAllDetail($idInvoice);
     /* @var $item \App\Entity\Invoice */

Кажется неправильным, что phpStorm заставляет изменить рабочий код; это больше беспорядок, чем ясность.

Acyra 08.08.2019 21:25

В основном, когда вы это делаете

$this->getDoctrine()->getRepository()

Он возвращает Doctrine EntityRepository. Так что это нормально, если phpstorm жалуется на ваш метод findAllDetails, потому что EntityRepository этого не знает.

Из документация:

By default the EntityManager returns a default implementation of Doctrine\ORM\EntityRepository when you call EntityManager#getRepository($entityClass).

Поэтому, даже если вы переопределите это поведение, как предлагается в документе, я полагаю, что phpstorm сохраняет ссылку на значение по умолчанию.

Спасибо за разъяснение,

Defrian Afdi 24.05.2018 10:16

Класс репозитория публикуется в файле services.yaml и вызывается в контроллере

$invoiceRepository = $this->get(InvoiceRepository::class);

или же

/** @var InvoiceRepository $invoiceRepository **/
$invoiceRepository = $this->getDoctrine()->getRepository(Invoice::class);

$invoice = $invoiceRepository->findAllDetail($idInvoice);

Я бы сконструировал контроллер с репозиторием (и почтовой программой), а не ввел бы его в действие - автоматическое подключение отсортирует инъекции, нет путаницы с параметрами uri, и хорошо быть явным - ваше будущее будет вам благодарно:

# Controller.php

/**
 * @var InvoiceRepository
 */
private $invoiceRepo;

/**
 * @var \Swift_Mailer
 */
private $mailer;

/**
 * @param InvoiceRepository $invoiceRepo
 * @param \Swift_Mailer $mailer
 */
public function __construct(InvoiceRepository $invoiceRepo, \Swift_Mailer $mailer)
{
    $this->invoiceRepo = $invoiceRepo;
    $this->mailer = $mailer;
}

/**
 * @Route("/invoice/review/{idInvoice}", name = "submitToReview", requirements = {"idInvoice" = "\d+"})
 * @param $idInvoice
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 */
public function submitToReview($idInvoice)
{
    $invoice = $this->invoiceRepo->findAllDetail($idInvoice);
    ...
}

Другие вопросы по теме