在ZF2中获取服务定位器

时间:2013-06-01 17:18:06

标签: zend-framework2 service-locator

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

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

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

2 个答案:

答案 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