Zend framework2 服务经理建议
我只是在寻求关于处理这种情况的最佳方法的建议 现在我在一个叫做服务的文件夹里有几个文件。这些文件联系了几个函数,它们当然会做一些随机的事情。每个文件都需要访问SM适配器 我的问题是,我应该在每个文件中实现ServiceManagerRawareInterface,还是应该创建一个实现ServiceManagerRawareInterface的新类,并在实现此服务的新类上扩展我的类Zend framework2 服务经理建议,zend-framework2,Zend Framework2,我只是在寻求关于处理这种情况的最佳方法的建议 现在我在一个叫做服务的文件夹里有几个文件。这些文件联系了几个函数,它们当然会做一些随机的事情。每个文件都需要访问SM适配器 我的问题是,我应该在每个文件中实现ServiceManagerRawareInterface,还是应该创建一个实现ServiceManagerRawareInterface的新类,并在实现此服务的新类上扩展我的类 这两种方法都能正常工作,只是不确定哪种方法更合适。您可以添加初始值设定项。它可以减少在获得通过db适配器的服务时的重
这两种方法都能正常工作,只是不确定哪种方法更合适。您可以添加初始值设定项。它可以减少在获得通过db适配器的服务时的重复注入。或者,您可以设置抽象工厂,这将减少重复的SM注册。我刚刚在这里发布了SM备忘,希望对您有所帮助:)
您可以添加初始值设定项来完成此操作。它可以减少在获得通过db适配器的服务时的重复注入。或者,您可以设置抽象工厂,这将减少重复的SM注册。我刚刚在这里发布了SM备忘,希望对您有所帮助:)
如果您认为您的系统将始终依赖ZF2,那么这两种方法是等效的 现在,从OO设计的角度来看,我个人倾向于扩展服务然后实现ServiceManagerWareInterface的方法。我甚至会使用ServiceLocator上的依赖接口来保护更多的类。为什么? 扩展类不会花费很多,使类依赖于接口也是如此 让我们以这个例子为例,假设您在ZF1项目期间没有使用这种方法,在此期间您可能已经使用Zend_注册表解决了依赖关系。 现在,假设您使用了ZF2实现,您认为将花费多少时间在服务层上将代码从
Zend_Registry::get($serviceX)
重构为$this->getServiceManager()->get($serviceX)
现在假设您选择了保护类,首先创建自己的服务定位器接口,简单如下:
public interface MyOwnServiceLocatorInterface{
public function get($service);
}
在ZF1下,您使用Zend_注册表创建了一个适配器类:
public class MyZF1ServiceLocator implements MyOwnServiceLocatorInterface{
public function get($service){
Zend_Registry::get($service);
}
}
您的服务类没有耦合到Zend_注册表,这使得重构更加容易
现在,您决定转移到ZF2,以便在逻辑上使用serviceManager
。然后创建此新适配器类:
public class MyZF2ServiceLocator implements
ServiceManagerAwareInterface,MyOwnServiceLocatorInterface
{
private $_sm;
public function get($service){
$this->_sm->get($service);
}
public function setServiceManager($serviceManager){
$this->_sm = $serviceManager;
}
}
同样,您的服务类没有耦合到ZF2ServiceManger
现在,您的服务层在ServiceManager上的配置/注册看起来如何。好的,您将使用模块::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
现在,在总结上一个示例之前,我必须注意,我没有处理通过工厂构造类的情况,但是,您可以检查我的一个示例,它解决了工厂主题,但也解决了应用程序层之间松耦合的重要性。如果您认为您的系统将始终依赖ZF2,这两种方法是等效的 现在,从OO设计的角度来看,我个人倾向于扩展服务然后实现ServiceManagerWareInterface的方法。我甚至会使用ServiceLocator上的依赖接口来保护更多的类。为什么? 扩展类不会花费很多,使类依赖于接口也是如此 让我们以这个例子为例,假设您在ZF1项目期间没有使用这种方法,在此期间您可能已经使用Zend_注册表解决了依赖关系。 现在,假设您使用了ZF2实现,您认为将花费多少时间在服务层上将代码从
Zend_Registry::get($serviceX)
重构为$this->getServiceManager()->get($serviceX)
现在假设您选择了保护类,首先创建自己的服务定位器接口,简单如下:
public interface MyOwnServiceLocatorInterface{
public function get($service);
}
在ZF1下,您使用Zend_注册表创建了一个适配器类:
public class MyZF1ServiceLocator implements MyOwnServiceLocatorInterface{
public function get($service){
Zend_Registry::get($service);
}
}
您的服务类没有耦合到Zend_注册表,这使得重构更加容易
现在,您决定转移到ZF2,以便在逻辑上使用serviceManager
。然后创建此新适配器类:
public class MyZF2ServiceLocator implements
ServiceManagerAwareInterface,MyOwnServiceLocatorInterface
{
private $_sm;
public function get($service){
$this->_sm->get($service);
}
public function setServiceManager($serviceManager){
$this->_sm = $serviceManager;
}
}
同样,您的服务类没有耦合到ZF2ServiceManger
现在,您的服务层在ServiceManager上的配置/注册看起来如何。好的,您将使用模块::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
现在,在总结上一个示例之前,我必须注意,我没有处理通过工厂构造类的情况,但是,您可以检查我的一个示例,它解决了工厂主题,但也解决了应用程序层之间松耦合的重要性。我还想到了一些其他问题,可能只是将SM作为工厂注入Module.php文件中的每个服务文件,并创建一个_构造(ServiceManager$ServiceManager),现在我将所有服务文件设置为可调用的。下面是我的示例现在的样子。。。也许有人能指出我的逻辑是错的,或者我做的事情是对的。。。我也想到了别的东西,也许只是注射t