Выберите менеджера сущностей с Внедрением зависимостей в Symfony - PullRequest
0 голосов
/ 04 февраля 2020

Я определил двух разных менеджеров сущностей в doctrine .yaml

entity_managers:
            EM1:
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    App\EM1:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/BC1/Domain/Entity'
                        prefix: 'BC1\Domain\Entity'
                        alias:  App\EM1
            EM2:
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    App\EM2:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/BC2/Domain/Entity'
                        prefix: 'BC2\Domain\Entity'
                        alias:  App\EM2

, и я добавляю Doctrine EntityManagerInterface в мой сервис:

service.yaml

    DoctrineRepository:
        class: BC\Infrastructure\Persistence\DoctrineRepository
        arguments:
            - "@Doctrine\\ORM\\EntityManagerInterface"

DoctrineRepository. php

    public function __construct(
        EntityManagerInterface $client
    ) {
        $this->entityManager = $client;
    }

Я хочу иметь возможность выбрать, какой Entity Manager ранее определен (EM1, EM2), который я хочу использовать при использовании DoctrineRepository. В идеале это будет что-то вроде:

$this->entityManager->useEntityManager('EM2');

Нужно ли вводить другой сервис вместо Doctrine \ ORM \ EntityManagerInterface? Я отладил загрузку менеджеров сущностей и обнаружил, что он автоматически назначает первый при генерации кеша:

cache / dev / getDoctrineRepositoryService. php:

return $this->privates['DoctrineRepository'] = new BC\Infrastructure\Persistence\DoctrineRepository(($this->services['doctrine.orm.EM1_entity_manager'] ?? $this->load('getDoctrine_Orm_EM1EntityManagerService.php')));

Любая помощь будет Буду признателен, спасибо.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Я думаю, что нашел другое решение. Вместо внедрения EntityManagerInterface я ввел сам @ Doctrine (он внедряет объект Doctrine \ Bundle \ DoctrineBundle \ Registry), и из этого объекта вы можете сделать $ object-> getManager ($ manager), поэтому выберите менеджер сущностей ты хочешь

0 голосов
/ 04 февраля 2020

Поскольку у вас есть две службы, которые реализуют одну и ту же interface, вам нужно помочь autowiring из Symfony.

Как описано в документах :

вы можете создать нормальный псевдоним из интерфейса TransformerInterface для Rot13Transformer, а затем создать именованный псевдоним автопроводки из специальной строки, содержащей интерфейс, за которым следует имя переменной, совпадающее с именем, которое вы используете при выполнении инъекции

В вашем кейс

    # the ``App\EM2`` service will be
    # injected when an ``Doctrine\ORM\EntityManagerInterface``
    # type-hint for a ``$em2Manager`` argument is detected.
    Doctrine\ORM\EntityManagerInterface $em2Manager: '@App\EM2'

    # If the argument used for injection does not match, but the
    # type-hint still matches, the ``Doctrine\ORM\EntityManagerInterface``
    # service will be injected.
    Doctrine\ORM\EntityManagerInterface: '@App\EM1'
...