Подтвердить что ты не робот

Как вставить конкретный менеджер 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?

4b9b3361

Ответ 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