サービスコンテナにスタティックなファクトリメソッドを利用してインスタンスを登録する

サービスコンテナにスタティックなファクトリメソッドを利用してインスタンスを登録する

February 25, 2015,
tags: php symfony


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

最近Symfonyの深さに溺れそうな毎日を送っております。

さて、サービスコンテナに登録する際に、スタティックなファクトリメソッドを実行する場合にはどうしたらいいのか。
大したことないんですが、今日ちょっと調べたのでその記録がてら記事書いてみました。

そもそもサービスコンテナに登録する際にファクトリメソッドって使えるの?

そもそもサービスコンテナに登録する際に、ファクトリメソッドが使えるのって話になるかと思いますが、可能です。 例えば、Doctrineのリポジトリクラスをコンテナに登録したい場合に、以下のように登録することができます。

app.repository.category:
     class: Doctrine\Common\Persistence\ObjectRepository
     factory: [@doctrine.orm.entity_manager, getRepository]
     arguments:
         - AppBundle:Category

factoryで生成するためのサービスと、メソッド名を指定するだけで、生成してもらえます。 ちなみにこれはsymfony2.6以降の書き方なので、それ以前のバージョンの方は、以下のように書いてください。

app.repository.category:
    class: Doctrine\Common\Persistence\ObjectRepository
    factory_service: doctrine.orm.entity_manager
    factory_method:  getRepository
    arguments:
        - AppBundle:Category

スタティックなファクトリメソッドを利用する

まあ別に大したことするわけでもなく、単純にクラス名を指定してあげれば大丈夫です。
例えば、AWS SDK for PHPでオブジェクトを生成する場合は以下のようにします。

services:
    aws.redshift.client:
        class: Aws\Redshift\RedshiftClient
        factory: [Aws\Redshift\RedshiftClient, factory]
        arguments: [%aws.redshift.profile%, %aws.redshift.region%]

まとめ

結構簡単にシングルトンで生成されるインスタンスも登録できるので使ってみる価値はかなりあると思います。

参考

http://symfony.com/doc/current/components/dependency_injection/factories.html

comments powered by Disqus