我正在学习zf2,从网上阅读文档,教程等。现在,我对Zend\ServiceManager\ServiceManagerAwareInterface.php和Zend\ServiceManager\ServiceLocatorAwareInterface.php感到困惑。
另外,在某些地方(如控制器),我使用$this->getServiceLocator()来获取ServiceManager对象,而在其他一些地方,我们使用->getServiceManager(),它也返回相同的ServiceManager对象。
发布于 2013-09-08 19:35:41
定位器是接口。Zend 2的设计是用“按约定设计”完成的,这意味着您依赖于接口而不是类。Manager是Locator的默认实现。
除一个组件外,所有组件都使用定位器。但是,管理器提供的功能比界面显示的要多。Zend\Mvc\Application使用这些特性,因此依赖于Manager而不是Locator。
在*感知的初始化器中使用Locator的决定对于发布来说太晚了,所以这就是为什么同时存在一个ServiceLocatorAwareInterface和一个ServiceManagerAwareInterface。已经有用户代码使用Manager的初始化程序,因此为了向后兼容而保留它。在内部,所有组件都使用定位器初始化器。如果必须选择,请选择定位器,并尽可能将Manager放在一边。
很久以前,我还写了关于定位器和管理器的博客:https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application
发布于 2013-09-08 11:00:16
ServiceManager基本上是ServiceLocator接口的实现。出现这两种情况的原因是用户可以有自己的ServiceLocator接口实现。当您请求->getServiceManager()时,它将返回显式ServiceManager实现。通过使用->getServiceLocator(),您将请求ServiceLocator接口的任何实现,这可以是ServiceManager实现,也可以是您自己的实现。但是,由于大多数情况下只有默认的ServiceManager实现,所以您将得到相同的对象。
https://stackoverflow.com/questions/18682835
复制相似问题