在Symfony 2.1中查找通过postUpdate侦听器更改的内容

时间:2013-05-30 19:13:08

标签: symfony doctrine

我有一个postUpdate监听器,我想知道更新之前的值是什么,以及更新后数据库条目的值是什么。在Symfony 2.1中有没有办法做到这一点?我查看了存储在getUnitOfWork()中的内容,但由于更新已经发生,因此它是空的。

4 个答案:

答案 0 :(得分:8)

找到解决方案here。我需要的实际上是preUpdate()的一部分。我需要在LifecycleEventArgs上调用getEntityChangeSet()。

我的代码:

public function preUpdate(Event\LifecycleEventArgs $eventArgs)
{   
    $changeArray = $eventArgs->getEntityChangeSet();

    //do stuff with the change array

}

答案 1 :(得分:4)

您可以使用此ansfer Symfony2 - Doctrine - no changeset in post update

/**
 * @param LifecycleEventArgs $args
 */
public function postUpdate(LifecycleEventArgs $args)
{
    $changeArray = $args->getEntityManager()->getUnitOfWork()->getEntityChangeSet($args->getObject());
}

答案 2 :(得分:0)

您的实体:

/**
 * Order
 *
 * @ORM\Table(name="order")
 * @ORM\Entity()
 * @ORM\EntityListeners(
 *     {"\EventListeners\OrderListener"}
 * )
 */
class Order
{
...

你的听众:

class OrderListener
{
    protected $needsFlush = false;
    protected $fields = false;

    public function preUpdate($entity, LifecycleEventArgs $eventArgs)
    {
        if (!$this->isCorrectObject($entity)) {
            return null;
        }

        return $this->setFields($entity, $eventArgs);
    }


    public function postUpdate($entity, LifecycleEventArgs $eventArgs)
    {
        if (!$this->isCorrectObject($entity)) {
            return null;
        }

        foreach ($this->fields as $field => $detail) {
            echo $field. ' was  ' . $detail[0]
                       . ' and is now ' . $detail[1];

            //this is where you would save something
        }

        $eventArgs->getEntityManager()->flush();

        return true;
    }

    public function setFields($entity, LifecycleEventArgs $eventArgs)
    {
        $this->fields = array_diff_key(
            $eventArgs->getEntityChangeSet(),
            [ 'modified'=>0 ]
        );

        return true;
    }

    public function isCorrectObject($entity)
    {
        return $entity instanceof Order;
    }
}

答案 3 :(得分:-1)

您可以在学说文档中找到example

class NeverAliceOnlyBobListener
{
    public function preUpdate(PreUpdateEventArgs $eventArgs)
    {
        if ($eventArgs->getEntity() instanceof User) {
            if ($eventArgs->hasChangedField('name') && $eventArgs->getNewValue('name') == 'Alice') {
                $eventArgs->setNewValue('name', 'Bob');
            }
        }
    }
}