我试图在原则2中从实体外部禁用实体事件。每次我们向表中插入一条新记录时,需要运行一些文件操作,这些操作已经在带有prePersist注释的方法中实现了。但是,我还需要运行一些数据fixture,并跳过文件操作部分作为测试的一部分。
基本上我问是否有可能通过实体管理器禁用所有prePersist事件而不改变实体中的任何东西
如果您同意完全删除生命周期回调,那么您可以手动清空回调。这在动态夹具生成的情况下很有用。您只需这样做:
$this->em->getClassMetadata(get_class($object))->setLifecycleCallbacks(array());
感谢Jeremy Mikola (@jmikola)为我指明了正确的方向。
JimTheDev的解决方案实际上运行良好。
在我的一个测试类中,我有这个方法:
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);
}
ORM API无法禁用生命周期回调。
问题来自于外部侦听器在实体的生命周期回调被调用之后被调用的事实,因此即使是禁用回调的临时属性(由外部侦听器/订阅者设置)也无法工作。
考虑将逻辑从实体移动到外部侦听器/订阅者:这样,您将获得更多的灵活性,并且您将能够通过重用侦听器/订阅者本身内部的状态来关闭您所描述的行为。
// ...
public function prePersist(LifecycleEventArgs $args)
{
if ($this->skipCondition($args->getEntity()) {
return;
}
$this->manipulate($args->getEntity());
}
// ...