Symfony2でRepositoryをサービスコンテナに登録する
前回に引き続きDoctrineネタです。
例えば、何かのクラスでDoctrineのリポジトリが使いたい時、どういう実装をすればいいのだろうか?
いろいろ方法はあると思います。
今回はサービスコンテナ(service container)を利用した方法をご紹介します。
Repositoryクラスをサービスコンテナに登録する
僕もSymfony2を使い始めた時は考えもしなかったんですが、DoctrineのRepositoryクラスってサービスコンテナに登録できるんですよね。
以下のようにservices.ymlに書けば、出来るんですよね。
services:
app.repository.user:
class: Doctrine\Common\Persistence\ObjectRepository
factory: [ @doctrine.orm.entity_manager, getRepository]
arguments:
- AppBundle\Entity\User
2.5までは、factoryではなくfactory_classとfactory_methodを指定していたのですが、2.6以降はfactoryに配列で、使うオブジェクトと、メソッドを指定する方法が推奨されています。
これで、簡単にEntityManagerをservice containerから取り出せるようになります。
たとえばこんなクラスがあった場合
<?php
class UserSelectService
{
private $userRepository;
public function __constract(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function run()
{
return $this->userRepository->findAll();
}
}
app/config/services.yml以下のように書けばUserRepositoryクラスが使えますね。
services:
app.repository.user:
class: Doctrine\Common\Persistence\ObjectRepository
factory: [ @doctrine.orm.entity_manager, getRepository]
arguments:
- AppBundle\Entity\User
app.service.user_select:
class: AppBundle/Service/UserSelectService
arguments:
- @app.repository.user
これで、UserSelectSerivceはUserRepositoryを取得するための知識がいらなくなります。
ぜひぜひ、使ってみることをおすすめします。