[英]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
您可以通過許多不同的方式向服務定位器(本質上是不同的工廠)注冊您的服務。 您使用的“類型”工廠通常取決於服務的依賴性。 這些在文檔中有詳細說明 。
插件管理器,它是用於管理相關類型對象的專用服務管理器,例如視圖助手,控制器插件,控制器等。
該框架在邏輯上將不同類型的服務分開,盡管從根本上它們都是由服務管理器創建的,但是使用自己的服務管理器管理和創建類似的服務變得相當容易。 一些示例包括FormElementManager
, ControllerPluginManager
和ViewHelperPluginManager
。
服務可以是將由服務定位器實例化的任何對象。
這是常見的服務:
如果您正在使用Zend \\ Db,您可能還擁有UserTableGateway服務,以管理您的用戶持久性。 然后,您必須向服務定位器提供一個工廠,該工廠將實例化該類並提供依賴項(表名,適配器等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.