2014-02-25 51 views
2

我有一個文檔描述了我的應用中的一個模型, 我想在文檔加載後更改字段值,我發現使用事件偵聽器的方式是這樣。 我在我的config/services.yml中添加了一個新的監聽器(postLoad監聽器),我無法弄清楚如何獲取文檔並在發送之前對其進行更改。Symfony2 - 如何使用postLoad事件偵聽器和Doctrine MongoDB ODM更改文檔?

幫助將不勝感激。 :)

這是我加入的config/service.yml(下服務)

core.listener: 
    class: Matan\CoreBundle\EventListener\DocumentListener 
    tags: 
    - { name: doctrine_mongodb.odm.event_listener, event: postLoad } 

DocumentListener.php

namespace Matan\CoreBundle\EventListener; 

use Matan\CoreBundle\Document\App; 

class DocumentListener 
{ 
    public function postLoad() 
    { 
     //I Want to change it here 
    } 
} 
+0

請添加一些代碼:) – nifr

+0

我用代碼更新了原始郵件,謝謝! –

+0

現在你到底想要改變什麼? ...並基於什麼條件? – nifr

回答

5

解決方案:

,則應指定聽衆的方法將在您的服務定義中被調用:

- { name: doctrine_mongodb.odm.event_listener, event: postLoad, method: onPostLoad } 

現在您可以獲取剛剛從EventArgs傳遞給onPostLoad方法的文檔。

檢查它是否與您想要更改的模型相匹配,然後執行更改。

use Doctrine\ODM\MongoDB\Event\LifecycleEventArgs; 
use Acme\Your\Document\MyDocument; 

public function onPostLoad(LifecycleEventArgs $eventArgs) 
{ 
    $document = $eventArgs->getDocument(); 

    if !($document instanceof MyDocument) { 
     return; 
    } 

    // ... your code here 
    // $document->setLoaded(new \Date('now')); 
} 
+0

這正是我需要的,非常感謝! –

+1

來自[docs](http://symfony.com/doc/current/bundles/DoctrineMongoDBBundle/index.html#registering-event-listeners-and-subscribers):與Symfony2事件監聽器不同,Doctrine的事件管理器期望每個監聽器和訂戶具有與觀察到的事件相對應的方法名稱。由於這個原因,上述標籤沒有方法屬性。 – Ascherer

+0

不知道爲什麼添加方法名稱工作... – Ascherer

相關問題