使用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
应该映射到此实体管理器吗?
答案 0 :(得分:0)
不幸的是auto_mapping
只能在配置一个连接时使用,因此没有简单的单行配置可以解决问题。
无论如何,有一个简单的解决方案。
无论如何,当您致电$this->getContainer()->get('doctrine')
时,您会收到一个ManagerRegistry
(see the docs)的实例,其中有一个名为getManagerForClass
的方法。使用此方法,您可以编写不依赖于连接配置的代码。
你的例子将成为:
$class = 'MyBundle:AnEntity';
$manager = $this->getContainer()->get('doctrine')->getManagerForClass($class);
$manager->getRepository($className)
如果仅对一个捆绑包需要特殊处理,您可以采用上一种方法提供更好的解决方案。
您可以定义一种服务,以透明的方式为您调用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')