回答
我會盡我所能解釋服務,但Symfony2 docs做得比我能做得更好。
在它的核心,服務只是一個類。如果一個類在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,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--您將能夠在各種框架和語言中利用這一概念。
嘗試法比安斯基的一系列的主題文章:Dependency Injection。
- 1. 瞭解Symfony2服務
- 2. 瞭解服務和DAO層
- 3. 更好地瞭解在軌
- 4. 更好的理解服務
- 5. 更好地瞭解JavaScript的產生
- 6. 爲了更好地理解regionprops
- 7. 需要更好地瞭解FakeHttpContext
- 8. 試圖更好地瞭解SelectedValuePath和IsSynchronizedWithCurrentItem
- 9. 的PostgreSQL + GeoDjango內置:更好地瞭解點是如何翻譯
- 10. 瞭解Arel更好
- 11. 如何在RESTful服務中更好地指定ID
- 12. 如何從Symfony2中的服務中解析yaml文件
- 13. 更好地瞭解互聯網如何運作
- 14. 需要更好地瞭解如何RTOL,在scipy.integrate.odeint
- 15. @Transactional在REST層或服務層?哪個更好?
- 16. 服務層和db層的Spring註解
- 17. Symfony2中的服務
- 18. 服務中的Symfony2
- 19. 瞭解symfony2 deps
- 20. Maven和POI如何更好地瞭解文件的Excel在Java中
- 21. 更好地瞭解直方圖中的Gnuplot
- 22. symfony2中的服務 - 服務文件的外觀應該如何?
- 23. php-gettext如何更好地使用它
- 24. 瞭解$ http服務
- 25. 瞭解android服務
- 26. 更好地理解phantom.exit的()
- 27. 如何更好地組織Web服務接口
- 28. 如何更好地在生產服務器上執行EXCEL VBA
- 29. Restful web服務如何比基於SOAP的web服務更好
- 30. 如何在Symfony2中擴展Doctrine服務?
我理解DI,但我無法理解服務的東西 – user825904 2012-07-10 06:57:57
這是一回事。服務只是一個已經在DIC – MDrollette 2012-07-10 06:59:36
中指定的類,我從這個鏈接http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html學習了symfony2,任何人都可以告訴我這是什麼服務層或本教程如何使用服務層 – user825904 2012-07-10 07:00:51