根据这篇文章:http://www.maltblue.com/tutorial/zend-framework-2-servicemanager
ServiceManager是“简而言之是提供对象的简单应用程序注册表”。因此,我认为应该是一个单例,我们可以在应用程序中的任何位置进行访问。但是如果是ServiceManager,则不是。
为什么无法在应用程序中的任何地方获取服务定位器实例?
最佳答案
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
)被注入(inject)到对象中。关于zend-framework2 - 在ZF2中的任何地方获取服务定位器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16875194/