使用学说捆绑包,我正在创建一个捆绑包,该捆绑包需要与默认一个不同的数据库连接。
捆绑包创建了一个新的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')