我只是在寻找有关处理这种情况的最佳方法的建议。
现在我在一个名为Service的文件夹中有几个文件。这些文件联系了几个随机做的功能。每个文件都需要访问SM适配器。
我的问题是,我应该在每个文件中实现ServiceManagerAwareInterface还是应该创建一个实现ServiceManagerAwareInterface的新类,并在实现此服务的新类上扩展我的类?
两种方式都可以正常工作,只是不确定哪种方式更合适。
答案 0 :(得分:2)
如果您认为您的系统始终依赖于ZF2,则两种方法都是等效的。
现在从OO设计的角度来看,我个人偏好您扩展服务然后实现ServiceManagerAwareInterface的方法。我甚至会使用一个接口来实现对ServiceLocator的依赖,以保护更多我的类。为什么? 扩展你的课程不会花费你很多,同样根据接口来制作你的课程。
让我们以这个例子为例,想象一下你在ZF1项目中没有使用这种方法,在此期间你可能已经使用Zend_Registry解决了你的依赖关系。
现在,让我们假设您转到了ZF2实现,您认为您将在服务层上花费多少时间从Zend_Registry::get($serviceX)
到$this->getServiceManager()->get($serviceX)
重构代码?
现在假设您已经选择保护您的类,首先创建自己的服务定位器接口,如下所示:
public interface MyOwnServiceLocatorInterface{
public function get($service);
}
在ZF1下,您使用Zend_Registry创建了一个适配器类:
public class MyZF1ServiceLocator implements MyOwnServiceLocatorInterface{
public function get($service){
Zend_Registry::get($service);
}
}
您的服务类没有与Zend_Registry相关联,这使得重构变得更加容易。
现在,您决定转移到ZF2,以便您在逻辑上使用ServiceManger
。然后创建这个新的Adapter类:
public class MyZF2ServiceLocator implements
ServiceManagerAwareInterface,MyOwnServiceLocatorInterface
{
private $_sm;
public function get($service){
$this->_sm->get($service);
}
public function setServiceManager($serviceManager){
$this->_sm = $serviceManager;
}
}
同样,您的服务类未与ZF2 ServiceManger
耦合。
现在,看起来如何在ServiceManager上配置/注册服务层。那么,你将使用你的Module::getServiceConfig
类:
//Module.php
public function getServiceConfig()
{
return array(
'factories'=>array(
'My\ServiceA'=>function($sm){
return new My\ServiceA($sm->get('My\Service\Name\Space\MyZF2ServiceLocator'));
}
//Some other config
)
}
如您所见,您的Service类中不需要重构,因为我们通过依赖接口和使用适配器来保护它们。当我们使用闭包工厂时,我们甚至不需要扩展我们的Service类并实现ServiceLocatorAwareInterface
。
现在,在我之前的例子结束之前,我必须注意到我没有处理我的类是通过工厂构建的情况,但是,你可以检查我的previous answers之一解决工厂主题但是还有应用层之间松耦合的重要性。
答案 1 :(得分:1)
您可以添加初始化程序来执行此操作。它可以减少重复注入以获得通过db适配器的服务。或者,您可以设置abstract_factories,它将减少重复的SM注册。我刚刚在这里发布了SM Cheatsheet,希望对你有用:)
https://samsonasik.wordpress.com/2013/01/02/zend-framework-2-cheat-sheet-service-manager/