Zend framework2 服务经理建议

Zend framework2 服务经理建议,zend-framework2,Zend Framework2,我只是在寻求关于处理这种情况的最佳方法的建议 现在我在一个叫做服务的文件夹里有几个文件。这些文件联系了几个函数,它们当然会做一些随机的事情。每个文件都需要访问SM适配器 我的问题是,我应该在每个文件中实现ServiceManagerRawareInterface,还是应该创建一个实现ServiceManagerRawareInterface的新类,并在实现此服务的新类上扩展我的类 这两种方法都能正常工作,只是不确定哪种方法更合适。您可以添加初始值设定项。它可以减少在获得通过db适配器的服务时的重

我只是在寻求关于处理这种情况的最佳方法的建议

现在我在一个叫做服务的文件夹里有几个文件。这些文件联系了几个函数,它们当然会做一些随机的事情。每个文件都需要访问SM适配器

我的问题是,我应该在每个文件中实现ServiceManagerRawareInterface,还是应该创建一个实现ServiceManagerRawareInterface的新类,并在实现此服务的新类上扩展我的类


这两种方法都能正常工作,只是不确定哪种方法更合适。

您可以添加初始值设定项。它可以减少在获得通过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;
    }
}
同样,您的服务类没有耦合到ZF2
ServiceManger

现在,您的服务层在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;
    }
}
同样,您的服务类没有耦合到ZF2
ServiceManger

现在,您的服务层在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