我試圖從實體以外的教義禁止的實體事件2.每次我們插入新記錄到我們的餐桌,幾個文件操作需要以外的地方運行,這有已通過prePersist註釋的方法實現。不過,我還需要運行一些數據夾具,並跳過文件操作部分作爲測試的一部分。基本上我問是否有可能通過實體管理器禁用所有prePersist事件而不改變實體中的任何內容。學說2 - 禁用PrePersist從實體
在此先感謝。
我試圖從實體以外的教義禁止的實體事件2.每次我們插入新記錄到我們的餐桌,幾個文件操作需要以外的地方運行,這有已通過prePersist註釋的方法實現。不過,我還需要運行一些數據夾具,並跳過文件操作部分作爲測試的一部分。基本上我問是否有可能通過實體管理器禁用所有prePersist事件而不改變實體中的任何內容。學說2 - 禁用PrePersist從實體
在此先感謝。
禁用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());
}
// ...
如果您沒有問題完全刪除生命週期的回調,然後你可以空出手動回調。這在動態夾具生成的情況下非常有用。指着我在正確的方向
$this->em->getClassMetadata(get_class($object))->setLifecycleCallbacks(array());
感謝傑里米米高拉(@jmikola):您只需做到這一點。
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參數
看看[此](http://stackoverflow.com/questions/12738974/remove-doctrine-life-cycle-event-from-within-a-symfony2-controller)也 – Matteo 2015-11-19 11:50:36
,但對於餐後?我想跳過餐後... – Jekis 2014-04-09 09:29:29
'postLoad'是可靠的字段/列,但不是關聯。 – Ocramius 2014-04-09 14:08:41