2013-03-01 37 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