2012-01-24 51 views
2

只是一個簡單的問題,想知道從Symfony2中的服務容器檢索到的對象是通過引用還是作爲副本返回的?Symfony2服務容器 - 獲取()通過引用或複製返回對象?

我之所以這樣問是因爲我想知道如果我這樣做是這樣的:在一個控制器

public function helloAction() 
{ 
    $mailer = $this->get('acme.mailer'); 
    $mailer->shutdown(); 
} 

,並關閉()方法做了內部的對象,將在acme.mailer服務在容器中「關閉」?

換句話說,我可以在從容器中獲取服務後永久更改服務嗎?這是好的做法嗎?

感謝

回答

5

服務都通過引用就像所有PHP對象(默認)返​​回。

這並不意味着您將始終獲得給定服務的相同實例。

每個服務在一個範圍內定義。 DependencyInjection容器提供兩個通用範圍:

  • 容器 - 每次請求你得到相同的實例
  • 原型服務時間 - 每次請求你得到一個新的實例
服務時間

容器範圍是默認的範圍。

注意:Symfony引入了額外的範圍。

詳細瞭解範圍從官方文檔:How to work with Scopes

要回答這個問題的第二部分。如果服務在容器範圍內定義,我認爲在控制器中銷燬它不是一個好主意。應用程序的其他部分可能仍然需要它。我寧願在析構函數中執行關機。

相關問題