ServiceManager建议

时间:2013-01-29 18:50:01

标签: zend-framework2

我只是在寻找有关处理这种情况的最佳方法的建议。

现在我在一个名为Service的文件夹中有几个文件。这些文件联系了几个随机做的功能。每个文件都需要访问SM适配器。

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

两种方式都可以正常工作,只是不确定哪种方式更合适。

2 个答案:

答案 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/