2013-06-01 38 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實例(可能訪問其他服務),那麼您將違反控制反轉原則。

以下是兩種方式

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

其他方式

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

內某處Module.php

'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; 
     } 
    ) 

在第二個例子中的依賴($user_data)被注入對象。