Symfony | Как получить доступ к пользовательским методам из репозитория в контроллере? - PullRequest
0 голосов
/ 29 апреля 2019

Я настраиваю контрольный список для практики создания веб-приложений с использованием Symfony.Он работает путем ввода строки в форму и нажатия кнопки отправки.Входные данные хранятся в базе данных.

Я хочу вернуть входные данные, хранящиеся в базе данных, на веб-страницу.

В настоящее время входные данные хранятся в базе данных, и я написал функциюдля запроса DQL в моем репозитории.

Моя проблема в том, что я не могу получить доступ к методу, который я создал в моем контроллере.

Метод в моем репозитории:

    /**
     * @return Checklist[]
     */
    public function getAllItemsForChecklist(): array
    {
        $qb = $this->createQueryBuilder('c')
            ->select('item')
            ->from('checklist', 'x') 
            ->getQuery()
        ;

        return $qb->execute();
    }

Строка, которая пытается получить доступ к методу в контроллере (ошибка):

$items = $this->getDoctrine()
    ->getRepository(ChecklistRepository::class)
    ->getAllItemsForChecklist()
;

Согласно документации Symfony на https://symfony.com/doc/master/doctrine.html#querying-for-objects-the-repository это должноРабота.Тем не менее метод "getAllItemsForChecklist () не найден. В моей среде IDE выдается следующее сообщение:

Метод 'getAllItemsForChecklist' не найден в \ Doctrine \ Common \ Persistence \ ObjectRepository

Я не уверен, почему он не читает указанный мной класс репозитория.

Если кто-то знает, как решить эту проблему, он найдет метод, который я создал в своем репозитории, и будет очень признателен.

Также, если вам нужна дополнительная информация, пожалуйста, скажите мне, что я рад предоставить дополнительную информацию.

С уважением,

Стив

1 Ответ

3 голосов
/ 29 апреля 2019

Добро пожаловать в StackOverflow!

Во-первых, когда вы вызываете getRepository(), вы должны передать класс сущности, а не сам репозиторий, поэтому это будет выглядеть так:

$this->getDoctrine()->getRepository(Checklist::class);

Даже если вы это сделаете, ваша IDE не будет знать, что метод существует. Ваша IDE на самом деле неверна, метод действительно существует, ваша IDE просто не может узнать, какой объект был возвращен из вызова getRepository().

Как этого избежать? Выберите одно из этих решений (все они работают в PhpStorm, вариант 1 должен работать везде, вариант 2, вероятно, будет работать во всех современных IDE, я не знаю о поддержке варианта 3 в других IDE):

Вариант 1: внедрить его как услугу

public function myControllerRoute(ChecklistRepository $checklistRepository) {
    // now your IDE knows what methods are inside the $checklistRepository
    $items = $checklistRepository->getAllItemsForChecklist();
}

Вариант 2: введите его в IDE (и другие разработчики)

public function myControllerRoute() {
    /** @var ChecklistRepository $checklistRepository */
    $checklistRepository = $this->getDoctrine()->getRepository(Checklist::class);

    // after the typehint the IDE knows what type it is
    $items = $checklistRepository->getAllItemsForChecklist();
}

Вариант 3: использовать подтверждения

public function myControllerRoute() {
    $checklistRepository = $this->getDoctrine()->getRepository(Checklist::class);
    assert($checklistRepository instanceof ChecklistRepository);

    // after the assert the IDE knows what type it is
    $items = $checklistRepository->getAllItemsForChecklist();
}

Варианты 2 и 3 в значительной степени совпадают, но у варианта 3 есть дополнительный бонус, который на машине разработчика выдает исключение, если $checklistRepository не является экземпляром ChecklistRepository, в производственной среде вызовы assert() игнорируются и вообще не замедляйте выполнение.

...