簡體   English   中英

我怎樣才能更好地理解php中symfony2中的服務層

[英]How can i better understand service layer in symfony2 in php

我正在學習使用symfony2,但我很難學習什么是服務層以及它可以在哪里使用。

我怎樣才能更好地理解symfony2中的服務層

我會盡力解釋服務,但Symfony2 文檔比我能做得更好。

在它的核心,服務只是一個類。 當一個類在Symfony2的Dependency Injection Container (或簡稱Container )中注冊時,它就成了一個服務。此時,該類是應用程序服務層的一部分。

服務可能具有依賴關系(通常,它確實存在),但並不是必需的。 服務通常用作其他服務的依賴項。 讓我給你舉個例子:

  • 您有一個用於發送電子郵件的類,稱為EmailSender
  • 您有一個類,其中包含有關如何通過SMTP發送電子郵件的說明,稱為SmtpTransport
  • EmailSender具有SmtpTransport形式的依賴關系。 換句話說, EmailSender能夠完成其工作,需要將SmtpTransport實例注入其中。 (請注意,盡管EmailSender具有依賴關系,但SmtpTransport卻沒有。)

假設您需要在應用中的五個不同位置使用EmailSender 在每個位置,您可能有這樣的代碼:

$emailSender = new EmailSender(new SmtpTransport());  
$emailSender->send($email)

這不是很多代碼(因為EmailSender只有一個依賴項),但是當你決定使用SMTP而不是使用SMTP時,會發生什么呢? EmailSender應該使用sendmail的傳輸類? 您必須編輯每個代碼塊才能更新它。

另一種方法是將EmailSender及其依賴項注冊為服務。
注冊看起來像這樣:

// YourApp/YourBundle/Resources/config/services.yml
services:
  smtp_transport:
    class: YourApp\YourBundle\Email\SmtpTransport

  email_sender:
    class: YourApp\YourBundle\Email\EmailSender
    arguments:
      - @smtp_transport

現在,使用它(從container感知上下文):

$container->get('email_sender')->send($email);

請注意實際使用該類發送電子郵件有多簡單和清晰? 當然,你必須先完成注冊服務的工作,但這是微不足道的,只需要做一次。

想象一下, EmailSender有三個依賴項,而不是一個。 通過使用服務,您只需修改服務注冊,而無需更改實施代碼(用於發送電子郵件的代碼)。

簡而言之,服務層充當類的中央存儲庫,a)具有一個或多個依賴關系b)需要在“全局”范圍中使用。 通過從Dependency Injection Container獲取這些服務類,您最終可以獲得更少的冗余代碼,並且可以更輕松地進行廣泛的更改。

我可能錯了,但我認為Symfony2是第一個實現依賴注入容器的PHP框架。 因此,許多PHP開發人員可能不熟悉服務的概念。 我絕對建議您確保完全理解它,因為您會發現它是一個非常強大的工具。 此外,服務的概念絕不僅限於Symfony2甚至PHP - 您將能夠在各種框架和語言中利用這一概念。

試試Fabien關於這個主題的系列文章: 依賴注入

暫無
暫無

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

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