使用同一个数据库的几个项目,我们制作了一个Symfony2 Bundle来映射所有常用函数。
现在问题是我们有第二个数据库,我们需要相同类型的服务,就像第一个一样。
的 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: Acme\MainBundle\MainManager
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: Acme\SubBundle\SubManager
arguments: [ @doctrine.orm.entity_manager ]
的的Acme \子丛\ SubManager
class SubManager
{
public function __construct(EntityManager $em)
{
$em->getRepository('AcmeSubBundle:Bar'); // Throws exception
}
}
未知实体名称空间别名AcmeSubBundle
由于EntityManager
默认进入main
。
我的问题是, services.yml 中是否有“clean”注入特定实体经理作为参数的方式?
答案 0 :(得分:18)
于2013年2月18日回答
以下是从services.yml
发送特定实体经理的方法
Doctrine生成一个与其名称相关的新服务名称。
示例:
@doctrine.orm.default_entity_manager
在这种情况下,它会生成另外两个实体管理器
@doctrine.orm.main_entity_manager
@doctrine.orm.sub_entity_manager
传递的参数是Doctrine\ORM\EntityManager
对象
就我而言:
的 services.yml 强>
submanager:
arguments: [ @doctrine.orm.sub_entity_manager ]
2013年8月22日更新
另一种方法是直接提供存储库而不是管理器。
为此,您必须创建一个存放存储库的服务。
的 services.yml 强>
services:
acme.foo_repository:
class: Doctrine\Common\Persistence\ObjectRepository
factory_service: doctrine.orm.main_entity_manager
factory_method: getRepository
arguments:
- "AcmeMainBundle:Foo"
我们让doctrine生成给定的存储库 然后我们可以将它注入另一个服务
services:
mainmanager:
class: Acme\MainBundle\MainManager
arguments:
- @acme.foo_repository