2016-03-26 14 views
1

私が期待どおりに動作するために、依存性注入を得るのに苦労しています - 私は、接続先のサーバーを知る必要があり、クラス、APIを注入しようとしています注入パラメータ

を特定のユーザー。これは、各ユーザーが別のサーバーに接続する必要があるため、構成ファイル内のコンストラクターのプロパティをオーバーライドすることは無意味であることを意味します。

class MyController { 
    private $api; 

    public function __construct(Api $api) { 
     $this->api = $api; 
    } 
} 

class Api { 
    private $userServerIp; 

    public function __construct($serverip) { 
     $this->userServerIp = $serverip; 
    } 
} 

このクラスに正しいパラメータを挿入するにはどうすればよいですか?何とか定義を上書きすることは可能ですか?パラメータを使ってコンテナを呼び出すことによってクラスを取得する方法はありますか?

私はオブジェクトをインスタンス化するためにコンテナを呼び出そうとしていますが、そうでなければ定義に含まれるパラメータを渡しています。

答えて

1

IPは、あなたはおそらくuser => serverIPマッピングを行うロジックを持っています。 dbや単純なIDベースのシャーディングなどから読み込んでいるかもしれません。 (お使いのコントローラが、それはAPIインスタンスを必要とするユーザーを知っていると仮定)の代わりにあなたがApiFactoryを注入することができ、あなたのコントローラにApiを注入する今

class ApiFactory { 

    private function getIp(User $user) { 
     // simple sharding between 2 servers based on user id 
     // in a real app this logic is probably more complex - so you will extract it into a separate class 

     $ips = ['api1.example.com', 'api2.example.com']; 
     $i = $user->id % 2; 
     return $ips[$i]; 
    } 

    public function createForUser(User $user) { 
     return new Api($this->getIp($user); 
    } 
} 

:そのロジックを使用すると、特定のユーザーのApiを作成ApiFactoryサービスを構築することができます

class MyController { 
    private $apiFactory; 

    public function __construct(ApiFactory $apiFactory) { 
     $this->apiFactory = $apiFactory; 
    } 

    public function someAction() { 
     $currentUser = ... // somehow get the user - might be provided by your framework, or might be injected as well 
     $api = $this->apiFactory->createForUser($currentUser); 
     $api->makeSomeCall(); 
    } 
} 
-1

私は、私は完全にあなたの質問を理解していないですが、あなたはこのようなあなたのApiクラスを設定することができます

return [ 
    'Foo' => function() { 
     return new Api('127.0.0.1'); 
    }, 
]; 

は、より多くの例や詳細については、ドキュメントを見てください:http://php-di.org/doc/php-definitions.html


編集:

return [ 
    'foo1' => function() { 
     return new Api('127.0.0.1'); 
    }, 
    'foo2' => function() { 
     return new Api('127.0.0.2'); 
    }, 
]; 
+0

こんにちは、 - ええので、この定義では、すべてのAPIオブジェクトは、IP「127.0.0.1」を持つことになります - それは別のIPでのAPIをインスタンス化するので、どのように私は、コンテナを呼び出すことができますか? – PointToPoint

+0

@PointToPoint編集をご覧ください。また、ドキュメントを読んで、何かを試してみて、何を試したか説明してください。ブロックされている場所を理解することをお勧めします。 –