Как вставить конкретный менеджер Entity Entity в Symfony2?
Работая над несколькими проектами, использующими одну и ту же базу данных, мы создали пакет Symfony2 для отображения всех общих функций.
Теперь проблема в том, что у нас есть вторая база данных, и нам нужен такой же сервис, как и первый.
config.yml
doctrine:
dbal:
default_connection: main
connections:
main:
/* ... */
sub:
/* ... */
orm:
default_entity_manager: main
entity_managers:
main:
connection: main
mappings:
AcmeMainBundle: ~
sub:
connection: sub
mappings:
AcmeSubBundle: ~
auto_generate_proxy_classes: %kernel.debug%
@AcmeMainBundle > services.yml
services:
mainmanager:
class: Acme\MainBundle\MainManager
arguments: [ @doctrine.orm.entity_manager ]
Acme\MainBundle\MainManager
class MainManager
{
public function __construct(EntityManager $em)
{
$em->getRepository('AcmeMainBundle:Foo');
}
}
Этот набор работает отлично, я получаю все ожидаемые результаты, так как default_entity_manager
установлен в main
, который является правильным EntityManager.
Но теперь вот проблема.
@AcmeSubBundle > services.yml
submanager:
class: Acme\SubBundle\SubManager
arguments: [ @doctrine.orm.entity_manager ]
Acme\SubBundle\SubManager
class SubManager
{
public function __construct(EntityManager $em)
{
$em->getRepository('AcmeSubBundle:Bar'); // Throws exception
}
}
Псевдоним имен имен неизвестных объектов AcmeSubBundle
Так как EntityManager
по умолчанию идет в main
.
Мой вопрос в том, есть ли "чистый" способ вставить конкретный менеджер объектов в качестве аргумента в services.yml?
Ответы
Ответ 1
Ответа на этот вопрос 18/02/13
Вот способ передачи определенного менеджера объектов из services.yml
Doctrine генерирует новое имя службы относительно своих имен.
Пример:
@doctrine.orm.default_entity_manager
В этом случае он генерирует еще 2 менеджера сущностей
@doctrine.orm.main_entity_manager
@doctrine.orm.sub_entity_manager
Прошедший аргумент - это объект Doctrine\ORM\EntityManager
В моем случае:
services.yml
submanager:
arguments: [ @doctrine.orm.sub_entity_manager ]
Обновление 22/08/13
Альтернативой этому было бы прямое предоставление репозитория вместо менеджера.
Чтобы сделать это, вы должны создать службу, которая будет хранить репозиторий.
services.yml
services:
acme.foo_repository:
class: Doctrine\Common\Persistence\ObjectRepository
factory_service: doctrine.orm.main_entity_manager
factory_method: getRepository
arguments:
- "AcmeMainBundle:Foo"
Мы разрешаем доктрине генерировать данный репозиторий.
Затем мы можем ввести его в другую службу
services:
mainmanager:
class: Acme\MainBundle\MainManager
arguments:
- @acme.foo_repository