zf2 ServiceManager与ServiceLocator

M H*_*ill 15 service-locator zend-framework2 servicemanager

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

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

Jur*_*man 16

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

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

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

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


Bry*_*yan 5

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

  • 我坚持使用`ServiceLocator`因为它也有一个特性,所以我只是使用这个特性而不必一遍又一遍地实现SL/SM. (2认同)