答案 0 :(得分:3)
什么是服务?
“服务”是在应用程序(通常是PHP对象实例)中向服务管理器注册的任何信息。
服务管理器充当所有类的中央存储库;使用“服务工厂”抽象他们的创作。这将允许使用一个或多个“服务名称”在应用程序的任何区域中请求信息。
使用的术语并非特定于ZF2,而是Service Locator和Dependancy 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。
中有详细解释插件管理器,它是用于管理相关类型对象的专用服务管理器,例如视图助手,控制器插件,控制器等。
框架在逻辑上将不同类型的服务分开,尽管从根本上它们都是由服务管理器创建的,但是使用自己的服务管理器管理和创建类似的服务变得相当容易。一些示例包括FormElementManager
,ControllerPluginManager
和ViewHelperPluginManager
。
答案 1 :(得分:0)
服务可以是将由服务定位器实例化的任何对象。
以下是常见服务:
如果您正在使用Zend\Db,那么您可能还拥有UserTableGateway服务,以管理您的用户持久性。然后,您必须为服务定位器提供一个工厂,该工厂将实例化该类并提供依赖项(表名,适配器等)。