zf2 ServiceManager vs ServiceLocator
Posted
技术标签:
【中文标题】zf2 ServiceManager vs ServiceLocator【英文标题】: 【发布时间】:2013-09-12 00:47:46 【问题描述】:我正在学习 zf2,从网上阅读文档、教程等。现在我对Zend\ServiceManager\ServiceManagerAwareInterface.php
和Zend\ServiceManager\ServiceLocatorAwareInterface.php
感到困惑。
另外在某些地方(如控制器)我使用$this->getServiceLocator()
来获取ServiceManager
对象,而在其他一些地方我们使用->getServiceManager()
,它也返回相同的ServiceManager
对象。
【问题讨论】:
@Sam,那我们为什么需要这两种方法呢? 但是为什么会有两个接口。Zend\ServiceManager\ServiceManagerAwareInterface.php
和 Zend\ServiceManager\ServiceLocatorAwareInterface.php
。如果 SM 是 SL 的实现,为什么我们有一个单独的接口。
【参考方案1】:
定位器是接口。 Zend Framework 2 的设计是通过“契约式设计”完成的,这意味着您依赖于接口而不是类。 Manager 是 Locator 的默认实现。
除一个组件外,所有组件都使用定位器。但是,管理器提供的功能比界面说的要多。 Zend\Mvc\Application
使用这些功能,因此依赖于 Manager 而不是 Locator。
在 *Aware 初始化程序中使用定位器的决定对于发布来说为时已晚,所以这就是为什么同时存在 ServiceLocatorAwareInterface
和 ServiceManagerAwareInterface
的原因。已经有使用 Manager 的初始化程序的用户空间代码,所以为了向后兼容而保留它。在内部,所有组件都使用 Locator 初始化程序。如果必须选择,请选择定位器并尽可能将管理器放在一边。
不久前,我还写了一篇关于定位器和管理器的博客:https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application
【讨论】:
【参考方案2】:ServiceManager
基本上是ServiceLocator
接口的实现。拥有这两者的原因是用户可以拥有自己的ServiceLocator
接口实现。当您请求 ->getServiceManager()
时,它会返回显式的 ServiceManager
实现。通过使用->getServiceLocator()
,您正在请求ServiceLocator
接口的任何实现,它可以是ServiceManager
或您自己的实现。但大多数时候只有默认的ServiceManager
实现,所以你会得到相同的对象。
【讨论】:
这有点道理,但为什么我们有Zend\ServiceManager\ServiceManagerAwareInterface.php
。以及您认为应该使用哪种方法。以上是关于zf2 ServiceManager vs ServiceLocator的主要内容,如果未能解决你的问题,请参考以下文章