15

我正在学习 zf2,从网上阅读文档、教程等。现在我对Zend\ServiceManager\ServiceManagerAwareInterface.phpand感到困惑Zend\ServiceManager\ServiceLocatorAwareInterface.php

同样在某些地方(如控制器),我$this->getServiceLocator()用来获取ServiceManager对象,而在我们使用的其他地方->getServiceManager(),它也返回相同的ServiceManager对象。

4

2 回答 2

16

定位器是接口。Zend Framework 2 的设计是通过“契约式设计”完成的,这意味着您依赖于接口而不是类。Manager 是 Locator 的默认实现。

除一个组件外,所有组件都使用定位器。但是,管理器提供的功能比界面说的要多。使用Zend\Mvc\Application这些功能,因此依赖于 Manager 而不是 Locator。

在 *Aware 初始化程序中使用 Locator 的决定对于发布来说为时已晚,所以这就是为什么同时存在 aServiceLocatorAwareInterface和 a 的原因ServiceManagerAwareInterface。已经有使用 Manager 的初始化程序的用户空间代码,所以为了向后兼容而保留它。在内部,所有组件都使用 Locator 初始化程序。如果您必须选择,请选择定位器并尽可能将管理器放在一边。

很久以前,我还写了一篇关于定位器和管理器的博客:https ://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application

于 2013-09-08T19:35:41.167 回答
5

ServiceManager基本上是ServiceLocator接口的实现。拥有两者的原因是用户可以拥有自己的ServiceLocator接口实现。当您请求->getServiceManager()它时,它会返回显式ServiceManager实现。通过使用->getServiceLocator(),您请求ServiceLocator接口的任何实现,可以是您自己的实现ServiceManager或您自己的实现。但大多数时候只有默认ServiceManager实现,所以你会得到相同的对象。

于 2013-09-08T11:00:16.353 回答