zf2 ServiceManager与ServiceLocator

时间:2013-09-08 10:50:23

标签: zend-framework2 service-locator servicemanager

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

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

2 个答案:

答案 0 :(得分:16)

Locator是界面。 Zend Framework 2的设计是通过“按合同设计”来完成的,这意味着您依赖于接口而不是类。 Manager是Locator的默认实现。

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

在* Aware初始化程序中使用定位器的决定对于发布来说太晚了,所以这就是ServiceLocatorAwareInterfaceServiceManagerAwareInterface的原因。使用Manager的初始化程序已经存在userland代码,因此保留了向后兼容性。在内部,所有组件都使用Locator初始化程序。如果您必须选择,请选择定位器并尽可能将经理放在一边。

很久以前我还在博客上发表了关于定位器和经理的文章:https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application

答案 1 :(得分:5)

ServiceManager基本上是ServiceLocator接口的实现。拥有这两者的原因是用户可以拥有自己的ServiceLocator接口实现。当您请求->getServiceManager()时,它会返回明确的ServiceManager实现。通过使用->getServiceLocator(),您正在请求ServiceLocator接口的任何实现,这可以是ServiceManager或您自己的实现。但是,由于大多数时候只有默认的ServiceManager实现,因此您将获得相同的对象。