根据这篇文章: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)被注入(inject)到对象中。

关于zend-framework2 - 在ZF2中的任何地方获取服务定位器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16875194/

10-12 15:00