2012-04-27 87 views
9

我遵循本教程的指示:http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html,並創建了一個簡單的偵聽器,用於偵聽由Doctrine在插入或更新實體時調度的事件。 preInsert和postInsert事件工作正常,並在創建新實體時分派。但是,無論如何,preUpdate和postUpdate都不會在更新實體時調用。 onFlush也是如此。作爲一個方面說明,我有一個控制檯生成的控制器,支持基本的CRUD操作,並且保持不變。在Doctrine 2上未觸發的preUpdate和postUpdate事件

下面是一些代碼片段來演示我這樣做的方式。

config.yml

annotation.listener: 
    class: City\AnnotatorBundle\Listener\AnnotationListener 
    tags: 
     - { name: doctrine.event_listener, event: postUpdate} 

監聽器實現(我省略了其他功能,只留下postUpdate爲簡單起見)

class AnnotationListener 
{ 

    public function postUpdate(LifecycleEventArgs $args) 
    { 
     $entity=$args->getEntity(); 

     echo $entity->getId(); 
     die; 
    } 
} 

實體ID從不顯示,腳本繼續其執行直到完成,儘管在函數結束時死亡

回答

13

您忘了添加@HasLifecycleCallbacks註釋嗎?您可以使用​​註釋並完全跳過服務定義。

/** 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class YouEntity 
{ 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preUpdate(){ 
     // .... your pre-update logic here 
    } 
    .... 
} 

在我看來附上事件的這種方式是因爲你沒有定義新的服務和聽衆明確容易得多。此外,您可以直接訪問正在更新的數據,因爲此方法是實體中的位置。

現在,缺點是你與你的車型組合邏輯和在這個時候,應該儘可能避免...

你可以閱讀更多關於生命週期回調的位置: http://symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

+2

真的...但是,我必須使用其他實體和實體管理器本身以及可能的其他服務,所以它不是一個好主意。無論如何,現在看來問題已經解決了。我更新了最新版本的Symfony,清除了緩存,並且一切正常。 – tomor 2012-04-28 11:56:54

+0

啊,是的,如果你使用其他服務/實體,它是有道理的不要這樣:) – 2012-04-28 13:04:13