2011-03-14 122 views
2

我正在開發利用Doctrine 2的Zend Framework項目。我試圖讓Symfony的DI容器與項目一起工作,但我遇到了麻煩。假設我有一個需要注入兩個實例的類「Foo」。我可以設置一個Symfony DI容器沒問題,以便爲我提供一個注入了依賴關係的新「Foo」。大!但是現在如果我想讓「Foo」成爲一個學說實體呢?當我將實體插入到數據庫時,所有這一切都很好,因爲我可以從DI容器中獲取一個新實體並簡單地保留該實體。但是,當我從數據庫主義查詢實體正在實例化我的「Foo」實例並且它們不會注入適當的依賴關係。我如何獲得Doctrine使用我的DI容器,以便實體具有適當的依賴關係?我知道Doctrine提供了一個「postLoad」鉤子,我可以使用它來爲我的實體注入依賴關係,但這種做法會破壞DI容器的用途和優點。Docfine 2與Symfony DI容器

回答

0

它有點棘手,但它可以做到的。 symfony di容器有一個補丁,它允許你將一個已經存在的對象傳遞給容器構建器實例,並讓di容器爲你配置它(例如,基於接口注入依賴)。該修補程序在github上的此存儲庫中實現:https://github.com/lstrojny/symfony但未將其上傳到symfony主存儲庫。

你使用這樣的:

$user = new User(); 
$container->configure('someId', $user); 

然後,你可以註冊Doctrine's eventmanager進行一餐後的事件處理程序(在這裏看到更多的細節:http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html)。在這個事件處理程序中,通過上述方法配置加載的實體。這很明顯,但你不能在這種情況下使用構造函數注入,只能使用setter。

設置起來有點棘手,但可以非常強大,特別是與symfony di容器基於接口注入依賴關係的能力相結合。