2016-05-09 8 views
2

非常に単純な依存性注入コンテナを作成しました。DIコンテナのサービスロケータ

$foo = $container->get(Foo::class); 

は、これがうまく機能し、私がfooのコンストラクタで依存関係を注入することができます:私は言って、クラスのインスタンスを作成することができます。今、私が言ってクラスのインスタンスを作成したい:

$user = new User(); 

私はUserクラス内のコンテナからサービスにアクセスできるようにする必要がありますが、私はそれを行うための最善の方法はよく分かりません。私が避けたい2つの方法はコンテナをコンストラクタに渡し、次に上記のようにコンテナのgetメソッドを使用してFooのインスタンスを作成する方法です。

これを達成する正しい方法を誰かに教えていただければ幸いです。ありがとう

答えて

0

クラスとやり取りする必要がある機能の中に直接注入することができこれを行うの。最初に、現在のインスタンスを指す静的プロパティをコンテナに追加しました。たとえば:

class Container { 
    protected static $instance; 

    public function __construct() { 
     static::$instance = $this; 
    } 

    ... 
} 

がそれから私がしなければならないすべては、例えば、静的なgetメソッドを作成している:

public static function getInstance($name) { 
    return static::$instance->get($name); 
} 

を残念ながら、それは同じ名前を持つことはできません。それを達成するためのハッキーな方法のためにhereをクリックしてください。

今、私はUserクラスに次のように言うことができます。

var foo = Container::getInstance(Foo::class); 
0

あなたはコンストラクタに注入する必要はありません。注入する方法はいくつかsetter関数

public function setUser(User $user) { 
    $this->user = $user; 
} 

経由だろうそれとも、私はきちんとした方法を作ってみた

public function someFunction(User $user) { 
    $val = $user->doSomething(); 
} 
+0

おかげで、私は本当にとしてそれ以外の場合は、私はユーザーインスタンスを作成するために、私の呼び出しを変更する必要がありますいずれか、このようにそれを行う必要はありません。理想的には静的なアクセサを使用したいのですが、コンテナ内で同じインスタンス(配列として格納)を共有するようにする方法がわかりません。 – nfplee

関連する問題