2

Symfony2 でサービス コンテナーを作成する場合、ほとんどの場合、"静的な" 引数 (他のクラスなど) をそのコンストラクターに渡します。

ただし、ファクトリを作成したいので、動的引数をサービス コンストラクターに渡すことができる必要があります。

私が見つけた例 ( http://symfony.com/doc/current/cookbook/service_container/factories.htmlなど) はすべて、静的引数を引数として使用することになります。

しかし、(たとえば) ユーザー入力に基づいて返すオブジェクトをファクトリに決定させたい場合は、どうすればよいでしょうか?

4

1 に答える 1

3

あなたのケースでサービスファクトリーが機能しない理由を理解するのにいくつか問題があります。互いに無関係な異なるサービス クラスを返す必要がありますか?

工場の例からわかることは、次のようなことができるということです。

class NewsletterFactory
{
    public function __constructor(...) 
    {
        // Receive arguments needed to create the service below
    }

    public function get()
    {
        // Say the variable $userInput exists and is derived from constructor
        if ($userInput === 'string') 
            return new NewsletterManager($dynamicArgument1);

        if ($userInput === 'integer') 
            return new AnotherNewsletterManager($dynamicArgument2);

        return new DefaultNewsletterManager();
    }
}

さて、これがあなたのニーズに合わない場合。CustomFactory必要なものを返すというサービスを作成することもできます。返されるものは直接サービスではないため、好きなことを行うことができます。ただし、これによりCustomFactory、依存関係コンテナーから作成されたオブジェクトを要求できなくなります。

それに似ているのはFormFactoryです。フォーム タイプをインスタンス化するために使用されるファクトリです。ただし、FormFactory依存性注入タグとコンパイラ パスと結合されているため、より強力です。これにより、各型が依存性注入システムに登録され、独自に取得できるようになります。コンポーネントのすべての内部構造を正確に把握しているわけではありませんがForm、他の方法で問題が解決しない場合は、問題を解決できると思います。

よろしく、
マット

于 2012-04-23T20:09:28.167 に答える