我只是在寻求处理这种情况的最佳方式的建议。
现在,我在一个名为Service的文件夹中有几个文件。这些文件联系了几个函数,这些函数当然会做一些随机的事情。这些文件中的每个文件都需要访问SM适配器。
我的问题是,我应该在每个文件中实现ServiceManagerAwareInterface,还是应该只创建一个实现ServiceManagerAwareInterface的新类,并在实现此服务的新类上扩展我的类?
这两种方式都应该正常工作,只是不确定哪种方式更合适。
发布于 2013-01-30 05:04:43
如果您认为您的系统将始终依赖于ZF2,那么这两种方法是等效的。
现在从OO设计的角度来看,我个人更喜欢先扩展服务然后实现ServiceManagerAwareInterface的方法。我甚至会对ServiceLocator上的依赖项使用一个接口来保护我的类。为什么?扩展你的类并不会花费你很多钱,同样的,让你的类依赖于接口。
让我们举个例子,假设你在一个ZF1项目中没有使用这种方法,在这个过程中,你可能已经用Zend_Registry解决了你的依赖关系。现在,让我们假设您转移到了一个ZF2实现,您认为在服务层上将代码从Zend_Registry::get($serviceX)重构到$this->getServiceManager()->get($serviceX)需要花费多少时间?
现在假设您已经选择了保护您的类,首先通过创建您自己的Service locator接口,就像这样简单:
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
)
}正如您所看到的,在您的服务类中不需要重构,因为我们通过依赖接口和使用适配器来保护它们。因为我们使用了闭包工厂,所以我们甚至不需要扩展我们的服务类和实现ServiceLocatorAwareInterface。
现在,在总结前面的示例之前,我必须注意到,我没有处理通过工厂构造类的情况,但是,您可以查看我的一个previous answers,它不仅解决了工厂主题,而且还说明了应用程序层之间松散耦合的重要性。
发布于 2013-01-30 03:32:55
你可以添加初始化器来做到这一点。它可以减少在获取通过db适配器的服务中的重复注入。或者,您可以设置abstract_factories,它将减少重复的SM注册。我刚刚在这里发布了SM Cheatsheet,希望能有所帮助:)
https://samsonasik.wordpress.com/2013/01/02/zend-framework-2-cheat-sheet-service-manager/
https://stackoverflow.com/questions/14590071
复制相似问题