如何在prePersist函数中取消保存实体

use*_*227 10 symfony doctrine-orm

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

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

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

Sgo*_*kes 5

您不能使用实体中的prePersist注释来执行此操作.您的方法存在的问题是您无法访问模型中的entityManager,但您需要告诉他不要坚持您的实体.

您可以使用事件监听器,如学说文档中所述:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners

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

但是我猜你可以通过将内容设置为notNull并将内容转换为null来实现更简单,如果长度为<1.确保持久化正确的实体是域逻辑的一部分,我不会在实体本身或一些事件监听器.如果你有许多这样的听众和条件,你最终会得到许多人都不知道的神奇约束.

除了上面的方法,您可以实现valid()方法并检查是否满足某些条件.如果valid()为true,您的域逻辑将仅保留实体.更好的方法是使用symfony2验证器验证您的实体,然后采取相应的行动.

  • 你的第一句话是错误的。`PrePersist`(和所有生命周期事件)被传递一个 `LifecycleEventArgs` 对象参数,它包含一个用于 `EntityManager` 和相关 `Entity` 的访问器。 (2认同)