4

別のファクトリサービスを使用するサービスを作成し、さまざまなタイプのオブジェクトを返す必要があります。
これが私のサービスの定義です:

services:
    games.search_factory:
        class: %games.search_factory.class%
        calls:
           - [ setContainer, ["@service_container"] ]

    games.search:
        class: %games.search.base.class%
        factory_service: games.search_factory
        factory_method: get

私の%games.search_factory.class% getメソッドは、リクエストパラメータに応じて異なるオブジェクトを返します。
%games.search.base.class%は抽象的です。
私の目標は-私が電話するとき

$this->get("games.search");  

ファクトリメソッドの結果を取得したい。しかし、コードを実行すると、次のエラーが発生します。FatalErrorException:エラー:抽象クラスをインスタンス化できません

だから私は2つの質問があります:

  1. DIシステムがファクトリメソッドの結果を返すのではなく、クラスをインスタンス化しようとするのはなぜですか?
  2. 必要なものを(きれいにそして簡潔に)実装する方法はありますか?

更新:コードの一部にバグがありましたが、ここには表示されていません。この2つの検索サービスの他に、検索タイプごとにサービスを用意し、工場から返送しました。しかし、これらのサービスの定義では、基本クラス(抽象)をクラスとして使用しました。

非常に良い結論は、ファクトリからさまざまなタイプのオブジェクトを返すことが可能であるということです。

4

1 に答える 1

2

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

ファクトリに使用するクラスを(factory_classを介して)指定すると、メソッドは静的に呼び出されます。ファクトリ自体をインスタンス化し、結果のオブジェクトのメソッドを呼び出す必要がある場合(この例のように)、ファクトリ自体をサービスとして構成します

コンテナをファクトリに注入するには、ファクトリをインスタンス化可能(抽象ではない)にするか、静的getメソッドの引数としてコンテナを渡す必要があります。サービスが静的であると宣言する方法を私は知りません。

于 2013-03-26T18:56:28.383 に答える