[英]How can i better understand service layer in symfony2 in php
我正在學習使用symfony2,但我很難學習什么是服務層以及它可以在哪里使用。
我怎樣才能更好地理解symfony2中的服務層
我會盡力解釋服務,但Symfony2 文檔比我能做得更好。
在它的核心,服務只是一個類。 當一個類在Symfony2的Dependency Injection Container
(或簡稱Container
)中注冊時,它就成了一個服務。此時,該類是應用程序服務層的一部分。
服務可能具有依賴關系(通常,它確實存在),但並不是必需的。 服務通常用作其他服務的依賴項。 讓我給你舉個例子:
EmailSender
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.