我只是在寻找有关我应该处理这种情况的最佳方式的建议。
现在,我在一个名为 Service 的文件夹中有几个文件。这些文件当然会联系几个做随机事情的函数。这些文件中的每一个都需要访问 SM 适配器。
我的问题是,我应该在每个文件中实现 ServiceManagerAwareInterface 还是应该只创建一个实现 ServiceManagerAwareInterface 的新类并在实现此服务的新类上扩展我的类?
两种方式都可以正常工作,只是不确定哪种方式更合适。
我只是在寻找有关我应该处理这种情况的最佳方式的建议。
现在,我在一个名为 Service 的文件夹中有几个文件。这些文件当然会联系几个做随机事情的函数。这些文件中的每一个都需要访问 SM 适配器。
我的问题是,我应该在每个文件中实现 ServiceManagerAwareInterface 还是应该只创建一个实现 ServiceManagerAwareInterface 的新类并在实现此服务的新类上扩展我的类?
两种方式都可以正常工作,只是不确定哪种方式更合适。
如果您认为您的系统将始终依赖 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
. 然后创建这个新的适配器类:
public class MyZF2ServiceLocator implements
ServiceManagerAwareInterface,MyOwnServiceLocatorInterface
{
private $_sm;
public function get($service){
$this->_sm->get($service);
}
public function setServiceManager($serviceManager){
$this->_sm = $serviceManager;
}
}
同样,您的 Service 类不耦合到 ZF2 ServiceManger
。
现在,ServiceManager 上的 Service 层的配置/注册看起来如何。好吧,您将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 类并实现ServiceLocatorAwareInterface
.
现在,在结束我之前的示例之前,我必须注意我没有处理我的类是通过工厂构造的情况,但是,您可以查看我之前解决工厂主题以及松散耦合重要性的答案之一在应用层之间。
您可以添加初始化程序来做到这一点。它可以减少通过db适配器获取服务时的重复注入。或者,你可以设置abstract_factories,它会减少重复的SM注册。我刚刚在这里发布了 SM Cheatsheet,希望对您有所帮助 :)
https://samsonasik.wordpress.com/2013/01/02/zend-framework-2-cheat-sheet-service-manager/