2013-06-01 8 views
6

のどこにでもサービスロケータを取得:http://www.maltblue.com/tutorial/zend-framework-2-servicemanagerは、この記事によるとZF2

ServiceManagerは、「オブジェクトを提供し、短い簡単なアプリケーションのレジストリに」です。だから、アプリケーションのどこにでもアクセスできるシングルトンでなければならないと思うだろう。しかし、ServiceManagerの場合はそうではありません。

アプリケーションのどこにでもサービスロケータインスタンスを取得できないのはなぜですか?

+0

正確に取得しますか? – Crisp

答えて

1

ここでは、ServiceLocatorが必要なときにオブジェクトをインスタンス化する簡単な方法です。アプリケーションのブートストラップのServiceLocatorをクラスの静的変数に設定する非常に単純なモジュールです...何かを作成するアイディアを得ることができますそれはあなたのニーズに合っていない場合は洗練されています:)ここにモジュールがあります。https://github.com/fezfez/ServiceLocatorFactory

+0

しかし、それはZF2のセマンティクスや何かを破ることはありませんか? – rafaame

+0

私はZF2のエキスパートではありませんが、これを解決するためにシングルトンを作成するのは奇妙なことだと思います。どこを初期化しますか? – Herbert

5

ServiceManagerは基本的にコンテナとして機能します。コンテナの内部では、作成したオブジェクトのさまざまな依存関係を満たしてから、他のオブジェクトで使用するためにそのオブジェクトを戻します。

SMがオブジェクトの上に座っているように、オブジェクトの内部には入っていません。オブジェクト内でSMインスタンスを使用している場合(おそらく他のサービスにアクセスする場合)、Inversion of Controlの原則に反するでしょう。続い

は、他の方法Module.php内部のどこか

class B { 
    private $data; 
    public function __constructor($user_data) { 
      $this->data = $user_data;  //$user_data getting injected from sm container 
    } 
} 

二つの方法

class A {  
    private $data; 
    public function __constructor($sm) { 
     $this->data = $sm->get('user_data'); // Service manager accessed inside the object 
    } 
} 

ある:第2の例示的依存性($user_data)で

'factories'=>   
    array(
     'objB'=> function($sm) { 
      //this is the container where sm sites outside the object to satisfy its dependencies 
      $objB = new B($sm->get('user_data')); 
      return $objB; 
     } 
    ) 

オブジェクトに注入されます。

関連する問題