Метод хранилища не найден - PullRequest
0 голосов
/ 24 мая 2018

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

Метод 'findAllDetail' не найден.

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

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

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 */

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

Я бы сконструировал контроллер с репозиторием (и почтовой программой), а не вводил его в действие - автопроводка будет сортировать инъекцию, нет путаницы с параметрами 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);
    ...
}
0 голосов
/ 24 мая 2018

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

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

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

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

По умолчанию EntityManager возвращает значение по умолчаниюреализация Doctrine \ ORM \ EntityRepository при вызове EntityManager # getRepository ($ entityClass).

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

0 голосов
/ 24 мая 2018

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

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

или

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

$invoice = $invoiceRepository->findAllDetail($idInvoice);
0 голосов
/ 24 мая 2018

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

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

... 
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 */
...