zf2 ServiceManager vs ServiceLocator

Posted

技术标签:

【中文标题】zf2 ServiceManager vs ServiceLocator【英文标题】: 【发布时间】:2013-09-12 00:47:46 【问题描述】:

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

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

【问题讨论】:

@Sam,那我们为什么需要这两种方法呢? 但是为什么会有两个接口。 Zend\ServiceManager\ServiceManagerAwareInterface.phpZend\ServiceManager\ServiceLocatorAwareInterface.php。如果 SM 是 SL 的实现,为什么我们有一个单独的接口。 【参考方案1】:

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

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

在 *Aware 初始化程序中使用定位器的决定对于发布来说为时已晚,所以这就是为什么同时存在 ServiceLocatorAwareInterfaceServiceManagerAwareInterface 的原因。已经有使用 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的主要内容,如果未能解决你的问题,请参考以下文章

关于ZF2中一点感悟,service_manager

关于ServiceLocator ,AdpaterAwareInterface 注入

zf2教义2 Zestful服务登录认证授权ACL

zf2,表单集合没有在zf2中创建正确的输入名称

ZF2维护页面

Android Binder ServiceManager启动源码分析