Я создал метод запроса к базе данных для всей таблицы соединения в репозитории. Я также прочитал документацию от Как создать собственный репозиторий. Метод работает исправно, но в 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 */
Желтое предупреждение было удалено, но это не сработало. я получаю сообщение об ошибке "Вы запросили несуществующую службу" App \ Entity \ Invoice "в моем приложении.
Вы не передаете объект, а репозиторий в качестве параметра вашему контроллеру - public function submitToReview($idInvoice, \Swift_Mailer $mailer, InvoiceRepository $repository)
Спасибо M.Kebza, ваш ответ исправит мою проблему!






Для тех, кто получает такое же предупреждение, ниже я расскажу, как это исправить (на основе комментария М. Кебза). поместите свой репозиторий в контроллер и передайте репозиторий в качестве параметра в контроллере
в контроллере
...
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 заставляет изменить рабочий код; это больше беспорядок, чем ясность.
В основном, когда вы это делаете
$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 сохраняет ссылку на значение по умолчанию.
Спасибо за разъяснение,
Класс репозитория публикуется в файле 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);
...
}
Вы используете плагин phpstorm Symfony? Вы используете свой репозиторий как услугу, поэтому получение его напрямую должно работать
$this->get(Invoice:class)->findAllDetail($idInvoice);