首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原则2-从实体外部禁用PrePersist

原则2-从实体外部禁用PrePersist
EN

Stack Overflow用户
提问于 2013-03-01 18:35:09
回答 3查看 5.1K关注 0票数 4

我试图在Doctrine 2中禁用来自实体外部的实体事件。每次我们将新记录插入到表中时,需要运行的文件操作很少,这些操作是在带有prePersist注释的方法中实现的。但是,作为测试的一部分,我还需要运行一些数据fixture并跳过文件操作部分。基本上,我问的是是否可以通过实体管理器禁用所有prePersist事件,而不更改实体中的任何内容。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-01 19:40:29

使用ORM不可能禁用lifecycle callbacks

问题来自于external listeners are called after the entity's lifecycle callbacks are invoked,所以即使是禁用回调的瞬态属性(由外部侦听器/订阅者设置)也不会起作用。

请考虑将逻辑从实体转移到外部侦听器/订阅者:这样,您将获得更大的灵活性,并且可以通过重用侦听器/订阅者本身内部的状态来关闭您所描述的行为。

代码语言:javascript
复制
// ...

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

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

// ...
票数 2
EN

Stack Overflow用户

发布于 2014-09-12 04:13:39

如果完全删除生命周期回调没有问题,那么可以手动清除回调。这在动态夹具生成的情况下很有用。您只需执行以下操作:

代码语言:javascript
复制
$this->em->getClassMetadata(get_class($object))->setLifecycleCallbacks(array());

感谢Jeremy Mikola (@jmikola)为我指明了正确的方向。

票数 12
EN

Stack Overflow用户

发布于 2015-04-27 18:04:57

JimTheDev's solution实际上工作得很好。

在我的一个测试类中,我有这个方法:

代码语言:javascript
复制
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);
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15155632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档