在几个使用相同数据库的项目上工作,我们制作了一个Symfony2捆绑包来映射所有常见的功能。
现在问题是我们有第二个数据库,我们需要与第一个数据库一样。
。config.yml
doctrine:
dbal:
default_connection: main
connections:
main:
/* ... */
sub:
/* ... */
orm:
default_entity_manager: main
entity_managers:
main:
connection: main
mappings:
AcmeMainBundle: ~
sub:
connection: sub
mappings:
AcmeSubBundle: ~
auto_generate_proxy_classes: %kernel.debug%
@acmemainbundle> services.yml
services:
mainmanager:
class: AcmeMainBundleMainManager
arguments: [ @doctrine.orm.entity_manager ]
acme mainbundle mainmanager
class MainManager
{
public function __construct(EntityManager $em)
{
$em->getRepository('AcmeMainBundle:Foo');
}
}
此集合正常,我将获得所有预期的结果,因为default_entity_manager
设置为main
,这是正确的EntityManager。
但是现在是问题。
@acmesubbundle> services.yml
submanager:
class: AcmeSubBundleSubManager
arguments: [ @doctrine.orm.entity_manager ]
acme subbundle submanager
class SubManager
{
public function __construct(EntityManager $em)
{
$em->getRepository('AcmeSubBundle:Bar'); // Throws exception
}
}
未知实体名称空间别名acmesubbundle
因为默认情况下EntityManager
进入main
。
我的问题是,是否有"清洁" 将特定实体管理器作为参数作为参数的方法
回答13/02/13
这是从services.yml
传递特定实体管理器的一种方法
学说相对于其名称生成了新的服务名称。
示例:
@doctrine.orm.default_entity_manager
在这种情况下,它会生成2个其他实体管理器
@doctrine.orm.main_entity_manager
@doctrine.orm.sub_entity_manager
传递的参数是DoctrineORMEntityManager
对象
在我的情况下:
services.yml
submanager:
arguments: [ @doctrine.orm.sub_entity_manager ]
更新22/08/13
替代方案是直接给出存储库而不是经理。
要执行此操作,您必须创建一个可以容纳存储库的服务。
services.yml
services:
acme.foo_repository:
class: DoctrineCommonPersistenceObjectRepository
factory_service: doctrine.orm.main_entity_manager
factory_method: getRepository
arguments:
- "AcmeMainBundle:Foo"
我们让学说生成给定的存储库。
然后,我们可以将其注入另一个服务
services:
mainmanager:
class: AcmeMainBundleMainManager
arguments:
- @acme.foo_repository