Symfony 3.3
を使用しているときに、次のようなサービスを宣言しています。
class TheService implements ContainerAwareInterface
{
use ContainerAwareTrait;
...
}
EntityManagerが必要な各アクションの内部では、コンテナーから取得します。
$em = $this->container->get('doctrine.orm.entity_manager');
これは少し面倒なので、SymfonyにEntityManagerAwareInterface
のような機能があるかどうか知りたいです。
従来、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
EMをservices.ymlで次のようにコンテナのサービスに挿入することがあります。
application.the.service:
class: path\to\te\Service
arguments:
entityManager: '@doctrine.orm.entity_manager'
そして、サービスクラスの__constructメソッドでそれを取得します。それが役に立てば幸い。