什么是 ZF2 中的服务


What is a service in ZF2

我已经搜索了很多,以了解什么是服务以及为什么以及何时应该使用它们?创建服务的最佳方式是什么?它与插件有什么区别?

我已经阅读了这里和这里的资源。

什么是服务?

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

服务

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

使用的术语并非特定于 ZF2,而是特定于服务定位器和依赖关系注入设计模式。

为什么要使用服务?

  • 注册服务名称或别名

您不再需要通过类名引用/创建对象;而是通过它的服务名称请求它。如果我的应用程序对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

  • 工厂
可以通过多种不同的方式向服务

定位器(实质上是不同的工厂)注册服务。您使用的工厂"类型"通常取决于服务的依赖项。文档中详细解释了这些内容。

  • 插件管理器
插件管理器

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

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

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

以下是常见的服务:

  • 控制器
  • 控制器插件
  • 查看帮助程序

如果您使用的是 Zend''Db,您可能还具有 UserTableGateway 服务来管理您的用户持久性。然后,您必须向服务定位器提供一个工厂,该工厂将实例化类并提供依赖项(表名、适配器等)。