2013-03-01 58 views
2

我試圖從實體以外的教義禁止的實體事件2.每次我們插入新記錄到我們的餐桌,幾個文件操作需要以外的地方運行,這有已通過prePersist註釋的方法實現。不過,我還需要運行一些數據夾具,並跳過文件操作部分作爲測試的一部分。基本上我問是否有可能通過實體管理器禁用所有prePersist事件而不改變實體中的任何內容。學說2 - 禁用PrePersist從實體

在此先感謝。

回答

1

禁用lifecycle callbacks是不可能的ORM API。

問題來自於external listeners are called after the entity's lifecycle callbacks are invoked這一事實,所以即使是一個禁用回調(由外部監聽器/訂戶設置)的瞬態屬性也不會起作用。

考慮從實體的邏輯移動到外部聽衆/用戶,而不是:這樣一來,你將獲得更多的靈活性,你將能夠關閉你通過重用內部狀態的聽衆描述的行爲/訂戶本身。

// ... 

public function prePersist(LifecycleEventArgs $args) 
{ 
    if ($this->skipCondition($args->getEntity()) { 
     return; 
    } 

    $this->manipulate($args->getEntity()); 
} 

// ... 
+0

,但對於餐後?我想跳過餐後... – Jekis 2014-04-09 09:29:29

+0

'postLoad'是可靠的字段/列,但不是關聯。 – Ocramius 2014-04-09 14:08:41

8

如果您沒有問題完全刪除生命週期的回調,然後你可以空出手動回調。這在動態夾具生成的情況下非常有用。指着我在正確的方向

$this->em->getClassMetadata(get_class($object))->setLifecycleCallbacks(array()); 

感謝傑里米米高拉(@jmikola):您只需做到這一點。

4

JimTheDev's solution實際效果很好。
在我的測試類的我有這個方法:

private function persistSkippingEvents($object, $manager) 
{ 
    // temporarily stores lifecycle events 
    $events = $manager->getClassMetadata(get_class($object))->lifecycleCallbacks; 

    // removes lifecycle events 
    $manager->getClassMetadata(get_class($object))->setLifecycleCallbacks(array()); 
    $manager->persist($object); 
    $manager->getClassMetadata(get_class($object))->setLifecycleCallbacks($events); 
} 
在我們的實體,並能夠檢查領域prePersist參數
+1

看看[此](http://stackoverflow.com/questions/12738974/remove-doctrine-life-cycle-event-from-within-a-symfony2-controller)也 – Matteo 2015-11-19 11:50:36