2012-07-10 55 views

回答

8

我會盡我所能解釋服務,但Symfony2 docs做得比我能做得更好。

在它的核心,服務只是一個類。如果一個類在Symfony2的Dependency Injection Container(或簡稱爲Container)中註冊,則該類將成爲服務。此時,該類是應用程序服務層的一部分。

一個服務可能有依賴關係(並且通常是這樣),但它不是必需的。服務通常用作其他服務的依賴項。我給大家舉一個例子:

  • 你必須用於發送電子郵件一類,稱爲EmailSender
  • 您有一個包含關於如何通過SMTP發送電子郵件的指示一類,稱爲SmtpTransport
  • EmailSenderSmtpTransport形式的依賴關係。換句話說,要使EmailSender能夠完成其工作,需要將SmtpTransport的實例注入到其中。 (請注意,雖然EmailSender具有相關性,SmtpTransport沒有。)

假設您需要在您的應用程序使用EmailSender在五個不同的地方。在每一個點,你可能有這樣的代碼:

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

這不是一個很大的代碼(因爲EmailSender只有一個依賴),但是當你決定,而不是使用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--您將能夠在各種框架和語言中利用這一概念。

1

嘗試法比安斯基的一系列的主題文章:Dependency Injection

+0

我理解DI,但我無法理解服務的東西 – user825904 2012-07-10 06:57:57

+0

這是一回事。服務只是一個已經在DIC – MDrollette 2012-07-10 06:59:36

+0

中指定的類,我從這個鏈接http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html學習了symfony2,任何人都可以告訴我這是什麼服務層或本教程如何使用服務層 – user825904 2012-07-10 07:00:51