7

現在、Symfony2DIコンテナインスタンスにサービスとそのすべての依存関係を用意しています。たとえば、Carクラスがあり、依存関係としてEngineとLightsがあるとします。

私の現在の設定では、Carオブジェクトが作成されるときに、これらの依存関係は両方ともセッターインジェクションによって自動的に作成されますが、今回はCarオブジェクトがライトを必要としないため、インスタンスを明示的に作成する必要がない可能性があります。この依存関係の。

Symfony DIでこれを達成する方法はありますか?したがって、必要な場合にのみLightsオブジェクトのインスタンスを作成しますか?私の推測では、Doctrineのようなプロキシの実装のようなものになるでしょうが、私が見た限りでは、SymfonyDIには存在しません。

4

4 に答える 4

2

services.ymlを介してコンストラクターを介して必須の依存関係を自動的に注入します。
オプションの依存関係がある場合は、必要なときにコントローラーのセッターを介してそれらを挿入します。

$this->container->get('cars')->setLights(new \Namespace\Lights());

もちろん、Carsクラスはそのように設計する必要があり、コントローラーまたは必要に応じてコードでインジェクションを自分で指示する必要があります。

于 2012-07-27T12:41:48.680 に答える
2

質問はすでに回答されていますが、この機能が必要な人のために、怠惰なサービスがSymfony2.3に実装されています。

をインストールする必要がありProxyManager bridgeます。

公式ドキュメントはここにあります

于 2013-10-23T13:15:49.183 に答える
1

非常に興味深い質問ですが、Symfony2の依存性注入コンテナ内では不可能だと思います。コンテナーは、ユーザーが指示した内容のみを認識します。この場合、特定のユースケースを条件とする依存関係があります。さらに、サービスの登録はアプリの初期段階で行われるため、これをどのように機能させることができるかわかりません。

たぶん、ファクトリパターンを使用する必要があります。をサービスとして登録すると、インスタンスCarFactoryをフェッチするときに、依存関係Carを含めるように指定できます。Light

なぜこれを達成したいのか聞いてもいいですか?より簡単な解決策があるかもしれません。

于 2012-07-10T22:18:12.607 に答える
0

これはかなりの回避策ではありませんが、DIC全体を注入し、必要に応じてLightおよびEngineサービスを取得してみることができます。

私はクラスでこのメソッドのようなものについて考えていましたCar

protected function getLightService() 
{
    if (!$this->light) {  //so we reuse the first instance
        $this->light = $this->dic->get("car.light");
    }

    return $this->light;
}
于 2012-07-11T08:49:20.360 に答える