如何在Symfony2中注入特定的学说实体经理



在几个使用相同数据库的项目上工作,我们制作了一个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

相关内容

  • 没有找到相关文章

最新更新