ZF2中的服务是什么?

时间:2014-11-17 05:04:11

标签: php zend-framework2

我经常搜索了解什么是服务以及我们何时以及何时使用它们?创建服务的最佳方式是什么?它与插件的区别是什么?

我已阅读herehere的资源。

2 个答案:

答案 0 :(得分:3)

什么是服务?

“服务”是在应用程序(通常是PHP对象实例)中向服务管理器注册的任何信息

服务管理器充当所有类的中央存储库;使用“服务工厂”抽象他们的创作。这将允许使用一个或多个“服务名称”在应用程序的任何区域中请求信息。

使用的术语并非特定于ZF2,而是Service LocatorDependancy Injection设计模式。

为什么要使用服务?

  • 注册服务名称或别名

您无需通过类名引用/创建对象;相反,你通过它的服务名称请求它。如果我的应用程序对FooService的要求有任何不同,我可以通过简单地更新注册到该名称的工厂来交换默认的FooServiceFactory以获得新的,可能非常不同的服务。

只有一个位置可以创建您的类(服务工厂)。考虑一个具有许多构造函数参数的类,如果要添加一个额外的参数,则意味着找到使用new创建对象并添加新参数的所有实例。

  • 依赖注入

在复杂的应用程序中,创建服务所需的参数本身就很复杂。我们称之为依赖。我们可以将这些依赖项建模为服务本身,并使用服务管理器请求并将它们“注入”所需的服务。

考虑一个EmailService,它有许多复杂的依赖关系,所有这些都可以从服务管理器请求,每个都有自己的工厂。

示例电子邮件服务工厂:

class EmailServiceFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        return new EmailService(
            $serviceLocator->get('Email\Config\EmailConfig'),
            $serviceLocator->get('Email\Entity\Repository\EmailRepository'),
            $serviceLocator->get('Message\Entity\Repository\MessageStatusRepository'),
            $serviceLocator->get('Email\Service\EmailTransportService'),
            $serviceLocator->get('Email\Service\EmailTemplateService')
        );
    }
}

<强> ZF2

  • 工厂

您可以通过许多不同的方式向服务定位器(基本上不同的工厂)注册您的服务。您使用的“类型”工厂通常取决于服务的依赖性。这些在documentation

中有详细解释
  • 插件管理员
  

插件管理器,它是用于管理相关类型对象的专用服务管理器,例如视图助手,控制器插件,控制器等。

框架在逻辑上将不同类型的服务分开,尽管从根本上它们都是由服务管理器创建的,但是使用自己的服务管理器管理和创建类似的服务变得相当容易。一些示例包括FormElementManagerControllerPluginManagerViewHelperPluginManager

答案 1 :(得分:0)

服务可以是将由服务定位器实例化的任何对象。

以下是常见服务:

     
  • 控制器
  •  
  • 控制器插件
  •  
  • 查看助手

如果您正在使用Zend\Db,那么您可能还拥有UserTableGateway服务,以管理您的用户持久性。然后,您必须为服务定位器提供一个工厂,该工厂将实例化该类并提供依赖项(表名,适配器等)。