2016-10-31 7 views
1

Symfony 3 Dependency Injectionコンポーネントでは、あるサービスのメソッドの戻り値を別のサービスのコンストラクタの引数として使用するにはどうすればよいですか? サービスメソッドの戻り値を使用して別のサービスを構築しますか?

は例えば、私はこれを模倣する設定構文を探しています:

<?php 

class Foo { 
    public function getParam() { 
    // ... 
    return $param; 
    } 
} 

class Bar { 
    public function __construct ($param) { 
    // ... 
    } 
} 

$foo = new Foo(); 
$bar = new Bar($foo->getParam()); 

答えて

4

あなたがUse a Factory to Create ServicesまたはInject Values Based on Complex Expressions例として、YAMLフォーマットで(式言語を経由してSF 2.4から始まる)ことができます。この方法では、Barは、オブジェクトグラフが構築された、すなわち後、実行時でgetParam()を呼び出すことができます:

services.yml

services: 
    app.foo: 
     class:  Foo 

    app.bar: 
     class:  Bar 
     arguments: ["@=service('foo').getParam()"] 

希望のヘルプ

2

あなたはこれを行うべきではない、ので、あなたがnot construct components using runtime dataをする必要があります。代わりにFooBarに注入するだけです。

class Bar { 
    private $foo; 
    public function __constract ($foo) { 
    $this->foo = $foo; 
    } 

    public function handle() { 
    $this->foo.getParam(); 
    } 
} 

// Composition Root 
$bar = new Bar(new Foo()); 
+0

こんにちは@私はあなたの提案について、あなたがこの種の操作を許可するために要求するフレームワークに同意します。私はこの機能をparsimonyで利用しています。 – Matteo

+3

@Steven - あなたが投稿したリンクは、特定のデータを実行時に要求することに重点を置いているようです。この質問にどのように適用できるかははっきりしない。はい、サービス・ロケータ・パターンを使用する必要がある場合がありますが、通常は依存性注入が優れています。もちろん、あなたがサービスfooとbarの名前をつけている人と対話しているときには、コンテキストがウィンドウの外に出ます。 – Cerad

+0

文脈の欠如に対する謝罪。私の特定のケースでは、 'Foo'は設定情報へのアクセスを提供します。したがって、 'getParam()'は、アプリケーションの設定された日付フォーマット文字列を返すかもしれません。私は 'Foo'に束縛されることを望んでいませんでした。 – user2045006

0

これを投稿した直後に見つけた解決策は、別のサービスとしてFoo :: getParam()の結果を格納することでした。

<container> 
    <services> 
     <service id="foo" class="Foo" /> 

     <service id="foo.param" public="false"> 
      <factory service="foo" method="getParam" /> 
     </service> 

     <service id="bar" class="Bar"> 
      <argument type="service" id="foo.param" /> 
     </service> 
    </services> 
</container> 

私はこれが受け入れられた解決策であるとは思わない。

関連する問題