2015-12-10 12 views
6

私はFooServiceを持っています。これは別の設定サービスからのデータを取り込みます。サービスのメソッド結果を別のサービスの引数として挿入する方法はありますか?

リクエストデータによって設定が異なるため、私はその設定サービスを持っています。設定サービスにはRequestStackが注入され、関連する設定配列が作成されます。

次のように私のFooServiceが見えます:

class Foo 
{ 
    private $config; 

    /** 
    * @param Config $config 
    */ 
    public function __construct(Config $config) { 
     $this->config = $config->getData(); 
    } 
} 

しかし、代わりにサービスを注入することは、ユニットテストのための単純であるとして、私は、getDataの唯一のメソッド呼び出しの結果を注入することを好みます。私は設定を嘲笑する必要はありません、私はちょうど配列を渡すことができます。

私の現在のservice.ymlは、定義などがあります。

config: 
    ... 

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
    arguments: 
     - @config 

私は経由してファクトリメソッドのためのように私のfoo定義を変更してみました:まだ、これはあまりにも全体のサービスを注入

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
    arguments: 
     - [@config, getData] 

サービスのメソッド結果を別のサービスの引数として挿入するにはどうすればよいですか?

答えて

8
あなたは一例として、何か行うことができますDOC hereで説明したように式言語( New in Symfony 2.4

でこれを達成することができます

config: 
    ... 

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
     arguments: ["@=service('config').getData()"] 

希望これをヘルプ

+1

括弧はあまりにも多く、ここでは配列の配列を注入します。 '' @ = service( 'config')。getData() "'で十分です。 =) – k0pernikus

+0

バージョン** 3 **以降、[ここ](http://symfony.com/doc/3.3/service_container/expression_language.html)に移動しました – Trix

0

あなたは基本的に依存性注入コンテナを求めています。 Fooの新しいインスタンスを返す単純な関数(たとえば、get())を持つ独自のものを作ることはできますか? get()の呼び出しごとに新しいオブジェクトを作成するように定義したり、常に同じオブジェクトを返すシングルトン(private static変数に格納)を作成することができます。例えば

<?php 
class FooContainer implements YourContainerInterface { 
    public static function get() { 
     // Config logic here 
     return new Foo($config); 
    } 
} 
+0

OPのようにresuを注入する方法を聞いているようですサービス自体ではなくサービスへのメソッド呼び出し - 私は彼らがなぜそれをしたいのかを明確に理解していませんが、私はその問題を誤解しているかもしれません。 –

+0

@JeremyHarris私はこれをやりたい理由のユースケースを更新しました。 – k0pernikus

+0

このような方法で関数を渡す唯一の方法は文字列経由です。追加のロジックを使用せずに型チェックを行うことができないので、理想的ではありません。 PHPでそれを行う適切な方法は、コンテナオブジェクト経由です。 – Ian

関連する問題