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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...