在Symfony中使用非默认实体管理器自动映射



使用学说捆绑包,我正在创建一个捆绑包,该捆绑包需要与默认一个不同的数据库连接。

捆绑包创建了一个新的Entity_manager,该套件通过配置使用新连接:

doctrine:
  orm:
    entity_managers:
       default:....
       my_custom_em:
          connection: my_custom_connection
          mappings:
            MyBundle: ~

尝试使用$this->getContainer()->get('doctrine')->getRepository('MyBundle:AnEntity');访问存储库时,我有错误:

  Unknown Entity namespace alias 'MyBundle'.

但是使用自定义实体管理器的名称时,它可以工作:$this->getContainer()->get('doctrine')->getRepository('MyBundle:AnEntity', 'my_custom_em');

无法检测到MyBundle应该映射到该实体管理器?

不幸的是,只有在配置一个连接时才能使用auto_mapping,因此没有简单的单行配置可以解决问题。

无论如何都有一个简单的解决方案。

使用注册表

无论如何,当您调用$this->getContainer()->get('doctrine')时,您将获得一个ManagerRegistry的实例(请参阅文档),该方法具有称为getManagerForClass的方法。使用此方法,您可以编写不依赖连接配置的代码。

您的示例将成为:

$class = 'MyBundle:AnEntity';
$manager = $this->getContainer()->get('doctrine')->getManagerForClass($class);
$manager->getRepository($className)

将ObjectManager定义为服务

如果仅需要一个捆绑包,则可以从以前的方法中采取更好的解决方案。

您可以定义一个服务,该服务将以透明的方式为您致电RegistryManager

service.xml中,您可以写:

<parameters>
    <parameter key="my.entity.an_entity.class">AcmeMyBundleEntityAnEntity</parameter>
</parameters>
<services>
    <service id="my.manager"
             class="DoctrineCommonPersistenceObjectManager"
             factory-service="doctrine" factory-method="getManagerForClass">
         <argument>%my.entity.an_entity.class%</argument>
    </service>
    <service id="my.an_entity_repository"
             class="DoctrineCommonPersistenceObjectRepository"
             factory-service="my.manager" factory-method="getRepository">
         <argument>%my.entity.an_entity.class%</argument>
    </service>
</services>

您的示例将成为:

$class = 'MyBundle:AnEntity';
$repository = $this->getContainer()->get('my.manager')->getRepository($class);
// or
$repository = $this->getContainer()->get('my.an_entity_repository')

最新更新