我试图从实体以外的教义禁止的实体事件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