Как оптимизировать использование репозитория Symfony4 Doctrine внутри контроллера

#php #symfony #doctrine-orm #doctrine #symfony4

#php #symfony #doctrine-orm #доктрина #symfony4

Вопрос:

Я ищу оптимизированное использование репозиториев Doctrine внутри контроллеров Symfony 4.

На данный момент я должен создать код следующим образом:

 /** @var ArticleRepository $repository */
$repository = $this->getRepository(Article::class);
$articles = $repository->findBySearchterm($search_term);
  

По правде говоря, мне не нравится этот подход. Если мне придется использовать $this->getRepository(Article::class) , я должен сообщить PhpStorm через дополнительную аннотацию, что возвращаемый метод имеет тип ArticleController . В противном случае PhpStorm предупреждает меня, что вызываемый метод ->findBySearchterm($search_term); неизвестен.

Я хотел бы оптимизировать это и использовать ArticleRepository напрямую, возможно, вот так: ArticleRepository::findBySearchterm($search_term);

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

Ответ №1:

Вы можете внедрить репозиторий непосредственно в метод контроллера следующим образом:

 public function index(ArticleRepository $repository)
{
    $articles = $repository->findBySearchterm($search_term);
    // The rest of the code
}
  

Это делается с помощью symfony autowiring

Комментарии:

1. Также лучше вводить через __construct , иначе вам придется вводить typehint index , add , edit и другие действия CRUD.

2. Это здорово! Почему это не упоминается в документации Symfony4 ( ссылка )? Этот подход выглядит лучше для меня. Но, чтобы список аргументов был коротким, я бы предпочел предложенное мной статическое использование. Есть ли способ добиться этого?

3. На самом деле это задокументировано здесь и здесь . Хорошей практикой является использование внедрения зависимостей. Репозитории doctrine не являются статическими, поэтому вы не можете использовать статические методы.