2012-04-02 9 views
2

依存性注入コンテナの概念に慣れ親しむために、PHPで基本的なRESTクライアントを構築しようとしています。最終的に、私は次のように何かをしたいと思います:RESTクライアントのPHP - DIコンテナ

$client = new RestClient(); 
$client->getService('user', array('id, optional fields...')); 

しかし、私はまた、要求を(私は、例えば、代わりにカールのfopenを使用する場合)を扱う必要のあるオブジェクトを指定できるようにしたいです。

私がこれまで読んだによると、これを達成するための適切な方法は、次のようになります。

$request = new ServiceDefinition( 
    'Curl', 
    array('...') 
); 
$user = new ServiceDefinition('User', 
    array(new ServiceReference('request')) 
); 
$container = new ServiceContainer(array( 
    'request' => $request, 
    'user' => $user, 
)); 

私の質問は次のとおりです。ユーザーオブジェクトと要求の間の依存関係を構築するための簡単な方法がありますオブジェクト? (RestClient()の基本的なセッター注入?)

ありがとうございます。

答えて

0

依存性注入に関する既存の知識に応じて、DIコンテナを使用すると、深いところでジャンプすることがあります。要するに、それは簡単なセッターインジェクションとコンテナを代用することは確かに可能です:

interface HttpAdapterInterface {} 
class CurlAdapter implements HttpAdapterInterface {} 
class SocketAdapter implements HttpAdapterInterface {} 

class RestClient { 
    public function setHttpAdapter(HttpAdapterInterface $adapter) { 
     // ... 
    } 
} 

ファビアンPotencierがa good series on DIを持っている、の2番目の部分はDIコンテナをカバー(とときにそれらを使用します)。

+0

あなたが気にしないかぎり、まだ質問があります。 Userオブジェクトを返すRestClientクラス関数に 'getUser($ id)'がある場合、DIコンテナを使用しないと、RestClientクラスとUserクラスの強い結合を避けるにはどうすればいいですか? –

+0

これは、DIコンテナがうまくいく場所です。私はUserモデルに 'Resolver'のようなものを持っているコンテナを持っています。これは基本的に、UserクラスがどのようにIDで取得するかのためのアダプタとして機能します。次に、あなたのRESTクライアントを含む具体的な 'RestClientResolver'があり、これを使ってユーザーをIDで取得する方法を知っています。 – cmbuckley

+0

上記のあなたの投稿を考慮してユーザーのインスタンシエーションを想像してみてください。申し訳ありませんが、それは愚かな要求のように聞こえるが、私はoopのこれらの良い慣行にはかなり新しいです。 –

関連する問題