Php ZF2中的服务是什么

Php ZF2中的服务是什么,php,zend-framework2,Php,Zend Framework2,我已经搜索了很多,以了解什么是服务,为什么以及何时应该使用它们?创建服务的最佳方式是什么?它和插件有什么区别 我已经从和中读取了资源。服务可以是任何将由服务定位器实例化的对象 以下是共同事务: 控制器 控制器插件 查看帮助程序 如果您使用的是UserTableGateway服务,那么您还可以使用它来管理用户的持久性。然后,您必须为服务定位器提供一个工厂,该工厂将实例化该类并提供依赖项(表名、适配器等)。什么是服务? “服务”是应用程序(通常是PHP对象实例)中向服务管理器注册的任何信息 服务

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


我已经从和中读取了资源。

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

以下是共同事务:

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

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

什么是服务?

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

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

所使用的术语并非特定于ZF2,而是特定于ZF2和设计模式

为什么要使用服务?

  • 注册服务名称或别名
您不再需要按对象的类名引用/创建对象;而是通过它的服务名称请求它。如果我的应用程序对
FooService
的任何一点要求不同,我可以通过更新注册到该名称的工厂,将默认的
FooServiceFactory
替换为新的、可能非常不同的服务

  • 抽象对象的创建
创建类的位置只有一个(服务工厂)。考虑一个具有许多构造函数参数的类,如果您要添加一个附加的参数,则意味着找到使用“<代码>新< /代码>创建新对象的所有实例,并添加新的参数。

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

考虑一个
电子邮件服务
,它有许多复杂的依赖项,所有这些依赖项都可以从服务管理器请求,每个都有自己的工厂

电子邮件服务工厂示例:

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

  • 工厂
有许多不同的方法可以使用服务定位器(本质上是不同的工厂)注册服务。使用哪种“类型”的工厂通常取决于服务的依赖关系。这些将在中详细说明

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

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