14

同じデータベースを使用するいくつかのプロジェクトに取り組み、すべての共通機能をマップする Symfony2 Bundle を作成しました。

問題は、2 つ目のデータベースがあり、最初のデータベースと同じ種類のサービスが必要なことです。

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');
    }
}

このセットは正常に動作します。適切な EntityManager に default_entity_manager設定されているため、期待されるすべての結果が得られます。main

しかし、ここで問題です。

@AcmeSubBundle > services.yml

submanager:
  class: Acme\SubBundle\SubManager
  arguments: [ @doctrine.orm.entity_manager ]

Acme\SubBundle\SubManager

class SubManager
{
    public function __construct(EntityManager $em)
    {
        $em->getRepository('AcmeSubBundle:Bar'); // Throws exception
    }
}

不明なエンティティの名前空間エイリアス AcmeSubBundle

以降EntityManagermainデフォルトで入ります。

私の質問は、特定のエンティティ マネージャーをservices.ymlの引数として挿入する「クリーンな」方法はありますか?

4

1 に答える 1

18

18/02/13 に回答

Doctrineから特定のエンティティ マネージャを渡す方法は、services.yml
それらの名前に関連する新しいサービス名を生成します。

例:

@doctrine.orm.default_entity_manager

この場合、他に 2 つのエンティティ マネージャが生成されます。

@doctrine.orm.main_entity_manager
@doctrine.orm.sub_entity_manager

渡された引数はDoctrine\ORM\EntityManagerオブジェクトです

私の場合:

services.yml

submanager:
    arguments: [ @doctrine.orm.sub_entity_manager ]

22/08/13 更新

これに代わる方法は、マネージャーの代わりにリポジトリを直接提供することです。

そのためには、リポジトリを保持するサービスを作成する必要があります。

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
于 2012-10-22T15:15:02.047 に答える