8

根据这篇文章: http: //www.maltblue.com/tutorial/zend-framework-2-servicemanager

ServiceManager 是“简而言之,一个提供对象的简单应用程序注册表”。所以,我认为它应该是一个我们可以在应用程序的任何地方访问的单例。但在 ServiceManager 的情况下,它不是。

为什么我无法在应用程序的任何位置获取服务定位器实例?

4

2 回答 2

6

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) 被注入到对象中。

于 2013-06-02T07:42:05.520 回答
2

这是一种让 ServiceLocator 实例化对象的简单方法...不符合您的需求:) 这是模块... https://github.com/fezfez/ServiceLocatorFactory

于 2013-06-01T18:12:04.593 回答