2014-12-06 21 views
0

當我創建自己的服務時,看起來每次都會創建我的對象。在Symfony 2開發模式下,每個請求都重建容器

服務:

services: 

    plbcache: 
    class: Robusta\PlbBundle\Cache\LruCache 
    arguments: [10, %timeout%, %enableCache%] 

類:

class LruCache { 

    public function __construct($capacity=10, $timeout=-1, $enabled=true) { 
     echo "creating the cache"; // Appear at each request 
     $this->capacity = $capacity; 
     $this->timeout = $timeout; 
     $this->enabled = $enabled; 
    } 
} 

很顯然,我現在的問題來測試我的對象是在緩存中,如果我的緩存對象每次重建。

對於我所瞭解的,Symfony的服務容器是一個單例,默認情況下給出單例 - 認爲它可以配置爲原型或客戶端會話。所以它應該在每次請求後給我相同的服務對象。

我不得不在文檔中看到容器在開發環境中重建。我錯過了什麼,或者我的代碼錯了? 如何防止dev模式重建我的緩存對象?

+0

你爲什麼不考慮使用會話?每個請求 - 至少在teorically - 與上一個沒有任何關係,因此每次重建對象都是強制性的和正確的。如果你的業務邏輯以另一種方式行事,你應該自己動手 – DonCallisto 2014-12-06 08:17:56

+0

對於我所瞭解的,Symfony的服務容器是一個單例。所以它在每次請求後都提供相同的服務。 – 2014-12-06 09:33:47

回答

1

容器不會在請求之間共享實例。每個請求都是獨立的,但您可以通過會話共享一些數據(例如)。 BTW在單個請求期間創建的所有對象一旦完成就會被銷燬。下一次請求每個對象都需要重新創建。

因此,儘管服務是單向的(但默認情況下可以改變行爲),但您應該將它們視爲「同一請求內的單例」。我想讓你注意到這是一個PHP行爲,而不是symfony嚴格的行爲。

+0

好的,像靜態對象在請求中是靜態的。所以使用$ _SERVER變量似乎是一個解決方案嗎? – 2014-12-06 11:31:30

+2

不是。如前所述,如果您希望在請求之間存活,那麼請使用會話。即使這樣,實際的對象也不能存活。它只是爲每個請求重建。你在使用Symfony 2框架嗎?如果是這樣的話,它已經有一堆緩存功能。 – Cerad 2014-12-06 14:23:25

+0

我不能添加任何東西給Cerad評論:) – DonCallisto 2014-12-06 17:56:32

0

每次您實例化一個類時,都會運行__construct()。每次運行symfony應用程序並訪問您的'plbcache'類時,都會創建一個該類的實例,從而運行__construct()方法。對象不會在運行PHP應用程序之間存儲在內存中,即每次運行一個進程然後死亡。

如果您希望某些數據在應用程序運行之間持久保存,您可以將它們保存到磁盤或數據庫或任何其他數據。如果您需要在特定時間點完成緩存構建,則應該創建一個像build()這樣的方法,然後在需要時在別處運行代碼。如果只需創建一次,則可以讓構造函數檢查它是否已創建或運行,如果不是,則運行build()