2012-07-10 65 views
7

延遲加載依賴關係目前,我已經準備好了一個Symfony2 DI容器實例,並提供了一個服務以及它的所有依賴關係。比方說,例如,我有一個Car類,它具有Engine和Lights作爲依賴關係。用symfony DI

在我當前的設置中,這兩個依賴關係都是在創建Car對象時通過setter注入自動創建的,但很可能我的Car對象不需要它的指示燈,因此它並不明確需要創建這個依賴關係的一個實例。

有沒有辦法在Symfony DI中實現這一點?因此,只需在需要時創建Lights對象的實例?我的猜測是它會像Doctrine這樣的代理實現,但據我所知,它在Symfony DI中不存在。

回答

2

注入是通過您的services.yml是通過構造強制性dedendencies,自動。
如果你有可選的依賴關係,當你需要它們時,通過Controller中的setter注入它們。

$this->container->get('cars')->setLights(new \Namespace\Lights()); 

當然你的汽車類的設計必須像這樣,你必須自己直接注射在你的控制器,或需要等。無論代號。

1

一個非常有趣的問題,但我認爲在Symfony2的依賴注入容器中是不可能的。容器只知道你告訴它的內容 - 在這種情況下,你有一個依賴於特定用例的依賴項。此外,服務的註冊在應用程序的生命早期就會發生,所以我不知道如何才能使其發揮作用。

也許你應該使用工廠模式。將CarFactory註冊爲服務,然後在獲取Car實例時,可以指定它應該包含Light依賴項。

請問爲什麼要達到這個目標?可能有一個更簡單的解決方案。

+0

那麼在我的情況下,我正在將DI組件獨立安裝到一個較舊的ZF項目中。我有幾個服務類(AdminService,UserService,...),它們都具有像DBAL,ACL等依賴項...這些是服務類正常運行的實際要求。另一方面,像Form和Model這樣的實例只能在一些ServiceClass的方法中使用。這些是「條件」依賴關係。 我在想這也是幾乎不可能的,除非Symfony DI有一個代理系統,像它的實體一樣使用教條。 – ChrisR 2012-07-11 06:33:24

0

這不是一個漂亮的解決方法,但您可以嘗試注入整個DIC,然後在必要時獲取Light和Engine服務。

我在思考着什麼樣的Car類此方法:

protected function getLightService() 
{ 
    if (!$this->light) { //so we reuse the first instance 
     $this->light = $this->dic->get("car.light"); 
    } 

    return $this->light; 
} 
+0

目前我沒有注入DI容器,而是像這樣從ZF FrontController引用它:'Zend_Controller_Front :: getInstance() - > getParam('bootstrap') - > getDic()'。任何理由不這樣做? – ChrisR 2012-07-11 11:08:19

+0

我沒有使用ZF的經驗,所以我無法回答。如果它適合你,我想沒關係。 – Maerlyn 2012-07-11 11:52:49

2

問題已經得到解答,但對於需要此功能的用戶,懶惰服務在Symfony 2.3中實現。您需要安裝ProxyManager bridge

你可以找到官方文檔here