根據這篇文章:http://www.maltblue.com/tutorial/zend-framework-2-servicemanager獲取服務定位器隨時隨地ZF2
的是的ServiceManager「總之一個簡單的應用程序的註冊表,提供對象」。所以,我認爲它應該是一個單例,我們可以訪問應用程序中的任何地方。但在ServiceManager的情況下,它不是。
爲什麼我無法在應用程序的任何位置獲取服務定位器實例?
根據這篇文章:http://www.maltblue.com/tutorial/zend-framework-2-servicemanager獲取服務定位器隨時隨地ZF2
的是的ServiceManager「總之一個簡單的應用程序的註冊表,提供對象」。所以,我認爲它應該是一個單例,我們可以訪問應用程序中的任何地方。但在ServiceManager的情況下,它不是。
爲什麼我無法在應用程序的任何位置獲取服務定位器實例?
這裏有一個簡單的方法來讓ServiceLocator實例化對象,無論你想要什麼......是一個非常簡單的模塊,它將ServiceLocator設置爲應用程序引導到類中的靜態變量......你可以創建一個想法更復雜,如果它不適合您的需求:)這裏是模塊... https://github.com/fezfez/ServiceLocatorFactory
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
)被注入對象。
你究竟在哪裏得到它? – Crisp