zend-framework2 – 在ZF2中的任何位置获取服务定位器

前端之家收集整理的这篇文章主要介绍了zend-framework2 – 在ZF2中的任何位置获取服务定位器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
根据这篇文章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)被注入到对象中.

猜你在找的PHP相关文章