簡體   English   中英

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服務,以管理您的用戶持久性。 然后,您必須向服務定位器提供一個工廠,該工廠將實例化該類並提供依賴項(表名,適配器等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM