#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
, иначе вам придется вводить typehintindex
,add
,edit
и другие действия CRUD.2. Это здорово! Почему это не упоминается в документации Symfony4 ( ссылка )? Этот подход выглядит лучше для меня. Но, чтобы список аргументов был коротким, я бы предпочел предложенное мной статическое использование. Есть ли способ добиться этого?
3. На самом деле это задокументировано здесь и здесь . Хорошей практикой является использование внедрения зависимостей. Репозитории doctrine не являются статическими, поэтому вы не можете использовать статические методы.