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

时间:2015-05-13 06:39:11

标签: php symfony doctrine-orm

使用doctrine-bundle,我创建了一个需要与默认数据库连接不同的数据库连接的包。

该捆绑包创建一个新的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应该映射到此实体管理器吗?

1 个答案:

答案 0 :(得分:0)

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

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

使用RegistryManager

无论如何,当您致电$this->getContainer()->get('doctrine')时,您会收到一个ManagerRegistrysee the docs)的实例,其中有一个名为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">Acme\MyBundle\Entity\AnEntity</parameter>
</parameters>

<services>
    <service id="my.manager"
             class="Doctrine\Common\Persistence\ObjectManager"
             factory-service="doctrine" factory-method="getManagerForClass">
         <argument>%my.entity.an_entity.class%</argument>
    </service>

    <service id="my.an_entity_repository"
             class="Doctrine\Common\Persistence\ObjectRepository"
             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')