2012-11-11 64 views
9

我在Zend Framework 2應用程序中使用Doctrine 2。有什麼方法可以使用ZF2將依賴關係注入由Doctrine返回的實體?從數據庫中檢索時,實體由Doctrine構建。據我所知在ZF2中注入依賴關係,我需要使用Service Locator實例化實體。我看不出如何將其與教義整合,而無需修改教義代碼庫。我現在看到的唯一可行的解​​決方案是編寫一個小型服務,它接受從Doctrine返回的結果並注入所需的依賴關係。有沒有更優雅的解決方案?ZF2與Doctrine 2 - 在實體中注入依賴關係

問候 基督教

+0

什麼你想要注入嗎?我無法想象一個將某些東西注入實體的情況。我確信有一種方法可以做到你想要的東西符合這個概念。 –

+0

在此期間,我採取了另一個方向。我想委託給實體本身的事物現在被委託給管理這些實體的服務。因此,不需要再向實體注入某些東西 – griesi

回答

16

看進學說EventManager,特別是postLoad生命週期事件,這是由eventmanager進行每一個實體從數據庫加載時間發射。

要將它全部整合到ZF2中,您需要做幾件事情。

首先,寫一個學說味的事件偵聽器:

<?php 
class InjectStuffListener { 
    private $sl; 

    public function __construct($serviceLocator){ 
     $this->sl = $serviceLocator; 
    } 

    public function postLoad($eventArgs){ 
     $entity = $eventArgs->getEntity; 
     $entity->setThingToBeInjected($this->sl->get('some.thing')); 
    } 
} 

然後,像一些Module.php某個地方(也許還有比onBootstrap一個更好的地方,但不管):

<?php 
public function onBootstrap(){ 
    $sm = $e->getApplication()->getServiceManager(); 
    $em = $sm->get('doctrine.entitymanager.orm_default'); 
    $dem = $em->getEventManager(); 
    $dem->addEventListener(array(\Doctrine\ORM\Events::postLoad), new InjectStuffListener($sm)); 

} 
+0

是的,但是我看不到我如何將它與ZF2服務定位器/服務管理器連接以注入由ZF2管理的依賴關係。實體本身不知道服務定位器,因爲它沒有通過服務定位器實例化。 – griesi

+0

@griesi - 參見我編輯的一些示例代碼,它初始化偵聽器並在ZF2引導過程中將它們附加到原則的EventManager中。 – timdev

+0

Thank's這就是我正在尋找 – griesi