Doctrine PreUpdate从未奏效

时间:2013-03-20 23:24:14

标签: php events symfony doctrine-orm lifecycle

我已经搜索过了,并且有很多问题都存在同样的问题,但没有一个问题可以解决我的问题。

我有一个实体,这是代码:

/*
 * @ORM\HasLifecycleCallbacks
 */
class MyEntity
{
    // some preoperties here...

    /**
     * @ORM\Column(type="text", nullable=true)
     * @Assert\MaxLength(limit="500")
     */
    private $delivery = null;

    /**
     * @var $deliveryOn bool
     *
     * Virtual field used for $delivery property organization
     */
    private $deliveryOn = false;

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preSetDelivery()
    {
        if ($this->deliveryOn == false)
            $this->delivery = null;
    }

    /**
     * @ORM\PostLoad()
     */
    public function loadDeliveryOn()
    {
        if ($this->delivery != null)
            $this->deliveryOn = true;
    }
}

loadDeliveryOn方法始终完美无缺。但是,当我第一次将实体持久化到数据库时,preSetDelivery仅解除了 。我希望在对象更新时调用它,但它不起作用。我不知道为什么。

我的编辑控制器:

public function editAction($id)
{
    // some code here...
    // ...

        $request = $this->getRequest();
        if ($request->isMethod('POST'))
        {
            $form->bind($request);

            if ($form->isValid())
            {
                $em->flush();
            }
        }
}

3 个答案:

答案 0 :(得分:0)

关于preUpdate的官方docs

  

对传递实体字段的更改无法识别   刷新操作,使用传递给的计算变更集   用于修改原始字段值的事件。

如果您有UnitOfWork的访问权限,可能有办法重新计算onFlush中的变更集?

答案 1 :(得分:0)

如果使用继承 - 例如@ORM \ InheritanceType(" SINGLE_TABLE") 你需要在父类

中添加@ORM \ MappedSuperclass

答案 2 :(得分:-1)

只有在实体上有实际更改时才会触发PreUpdate。如果您不更改表单中的任何内容,则实体上不会有任何更改,也不会调用preUpdate侦听器。