根据这篇文章:http://www.maltblue.com/tutorial/zend-framework-2-servicemanager
ServiceManager“简而言之就是一个提供对象的简单应用程序注册表”。所以,我认为它应该是一个单例,我们可以在应用程序的任何地方访问。但是在ServiceManager的情况下,它不是。
为什么我无法在应用程序的任何位置获取服务定位器实例?
答案 0 :(得分: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
)被注入到对象中。
答案 1 :(得分:1)
这是一个让ServiceLocator在任何地方实例化对象的简单方法...是一个非常简单的模块,它将应用程序引导程序上的ServiceLocator设置为类中的静态变量...你可以想到创建更多的东西如果它不符合你的需要,那就复杂了:)这是模块...... https://github.com/fezfez/ServiceLocatorFactory