根据这篇文章: http: //www.maltblue.com/tutorial/zend-framework-2-servicemanager
ServiceManager 是“简而言之,一个提供对象的简单应用程序注册表”。所以,我认为它应该是一个我们可以在应用程序的任何地方访问的单例。但在 ServiceManager 的情况下,它不是。
为什么我无法在应用程序的任何位置获取服务定位器实例?
根据这篇文章: 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
) 被注入到对象中。
这是一种让 ServiceLocator 实例化对象的简单方法...不符合您的需求:) 这是模块... https://github.com/fezfez/ServiceLocatorFactory