У вас может быть собственный общий «репозиторий», но вы не сможете получить его через Doctrine EntityManager. Вместо этого вы вводите его непосредственно в контроллер.
Ваш репозиторий может выглядеть примерно так:
class MyRepository implements RepositoryInterface
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function findFoo()
{
$builder = $this->entityManager->createQueryBuilder();
$query = $builder->... // build query
return $query->getResult();
}
// Implement the generic find-methods defined by the interface
}
Реализация интерфейса не обязательна, когда вы используете репозиторий напрямую, но он сделает его более знакомым. Внедрив entityManager, вы можете просто вызывать другие репозитории для извлечения данных или создавать конструктор запросов для написания собственных запросов.
В вашем контроллере вы затем добавите хранилище или получите его из контейнера, например, как это:
class FooController extends Controller
{
private $repository;
public function __construct(MyRepository $repository)
{
$this->repository = $repository;
}
public function indexAction(Request $request)
{
$foo = $this->repository->findFoo();
}
}
Вы также можете определить свой репозиторий как сервис:
# app/config/services.yml
services:
app.my_repository:
class: App\Repository\MyRepository
arguments:
- '@doctrine.orm.entity_manager'
и затем получить ваш репозиторий в контроллерах с помощью вспомогательного метода, а не внедрять его:
$this->get('app.my_repository');
Обратите внимание, что:
- Поскольку вы не можете реально использовать методы, определенные RepositoryInterface, так как вы не хотите работать с одной сущностью, где, например,
findOneBy
имеет смысл, возможно, имеет смысл не реализовывать интерфейс.
- Вы также можете дать этим классам другое имя. Например, вы можете поместить каждый запрос в свой собственный класс и иметь класс
FindFooQuery
, который вы вводите в качестве службы в свой контроллер. Таким образом, становится более ясным, что это на самом деле не связано с сущностью, но это своего рода вещь. Это может сделать этот подход более управляемым, когда у вас много запросов.