Symfony2でRepositoryをサービスコンテナに登録する

Symfony2でRepositoryをサービスコンテナに登録する

November 7, 2015,
tags: symfony doctrine2 php


このエントリーをはてなブックマークに追加

前回に引き続き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_classfactory_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を取得するための知識がいらなくなります。

ぜひぜひ、使ってみることをおすすめします。

参考: サービスを作成するファクトリの使用方法

comments powered by Disqus