web-dev-qa-db-ja.com

EntityManagerをサービスに注入する方法はありますか

Symfony 3.3を使用しているときに、次のようなサービスを宣言しています。

class TheService implements ContainerAwareInterface
{
    use ContainerAwareTrait;
    ...
}

EntityManagerが必要な各アクションの内部では、コンテナーから取得します。

$em = $this->container->get('doctrine.orm.entity_manager');

これは少し面倒なので、SymfonyにEntityManagerAwareInterfaceのような機能があるかどうか知りたいです。

6
user3429660

従来、services.ymlファイルに新しいサービス定義を作成し、エンティティマネージャーをコンストラクターの引数として設定していました。

app.the_service:
    class: AppBundle\Services\TheService
    arguments: ['@doctrine.orm.entity_manager']

最近では、symfony 3.3のリリースで、デフォルトのsymfony-standard-editionがデフォルトのservices.ymlファイルをデフォルトでautowireを使用するように変更し、AppBundleのすべてのクラスをサービス。これにより、カスタムサービスを追加する必要がなくなり、コンストラクターでタイプヒントを使用すると、適切なサービスが自動的に挿入されます。

その場合、サービスクラスは次のようになります。

use Doctrine\ORM\EntityManagerInterface

class TheService
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    // ...
}

サービスの依存関係の自動定義の詳細については、 https://symfony.com/doc/current/service_container/autowiring.html を参照してください

新しいデフォルトのservices.yml構成ファイルは、次の場所にあります: https://github.com/symfony/symfony-standard/blob/3.3/app/config/services.yml

23

EMをservices.ymlで次のようにコンテナのサービスに挿入することがあります。

 application.the.service:
      class: path\to\te\Service
      arguments:
        entityManager: '@doctrine.orm.entity_manager'

そして、サービスクラスの__constructメソッドでそれを取得します。それが役に立てば幸い。

1
Albeis