【问题标题】:How to cancel save an entity when stay in prePersist function停留在prePersist功能时如何取消保存实体
【发布时间】:2012-07-04 10:21:33
【问题描述】:

我有一个问题:在一个过程中,我想取消在 prePersit 函数中保存一个实体:

/**
 * @ORM\PrePersist
 */
public function setTranslationsValue2()
{
    if((null===$this->getContent())or($this->getContent()==''))
    {
        //wanna stop saving this item???
       return false;
    }
}

在上面的函数中,我不想再保存这个实体,也不想停止我的进程(该进程仍然保存另一个s)

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    您不能在实体中使用 prePersist 注释来做到这一点。您的方法的问题是您无法访问模型中的 entityManager,但您需要告诉他不要保留您的实体。

    您可以按照教义文档中的说明使用事件侦听器:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners

    然后,您将监听 prePersist 事件,查看是否有任何类型的实体要求持久化,并查看您的条件是否为真。如果是这样,您可以告诉 entityManager 分离实体。

    但是我想你可以通过将内容设置为 notNull 并将内容转换为 null 如果长度

    除了上述方法之外,您还可以实现一个 valid() 方法并检查是否满足某些条件。如果 valid() 为真,您的域逻辑只会保留实体。更好的方法是使用 symfony2 验证器来验证您的实体,然后采取相应的行动。

    【讨论】:

    • 谢谢,我会尝试创建一个事件监听器。
    • 文档访问受限,请查看链接。我收到“您无权访问此版本。”
    • 感谢您的提示。新链接是docs.doctrine-project.org/projects/doctrine-orm/en/latest/…。我相应地编辑了原始答案!
    • 您的第一句话是错误的。 PrePersist(和所有生命周期事件)都传递了一个 LifecycleEventArgs 对象参数,其中包含 EntityManager 和相关 Entity 的访问器。
    【解决方案2】:

    只需抛出新异常("Some message...");

    【讨论】:

    • OP 要求解决方案不要停止整个过程。
    • 这就是你从调用代码中捕获异常并处理场景的原因。
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多