Finding out what changed via postUpdate listener in Symfony 2.1

11,695

Solution 1

Found the solution here. What I needed was actually part of preUpdate(). I needed to call getEntityChangeSet() on the LifecycleEventArgs.

My code:

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

    //do stuff with the change array

}

Solution 2

You can use this ansfer Symfony2 - Doctrine - no changeset in post update

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

Solution 3

Your Entitiy:

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

Your listener:

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;
    }
}
Share:
11,695
keybored
Author by

keybored

What is this I don't even?

Updated on September 21, 2022

Comments

  • keybored
    keybored over 1 year

    I have a postUpdate listener and I'd like to know what the values were prior to the update and what the values for the DB entry were after the update. Is there a way to do this in Symfony 2.1? I've looked at what's stored in getUnitOfWork() but it's empty since the update has already taken place.

  • Lughino
    Lughino over 10 years
    Did you mean preUpdate(Event\PreUpdateEventArgs $eventArgs) ? The method getEntityChangeSet() does not exist in LifecycleEventArgs
  • Ashton Honnecke
    Ashton Honnecke over 7 years
    OP specifically asked for "values were prior to the update and what the values for the DB entry were after the update", your response requires a method call for each column that would need to be hardcoded.
  • Braian Mellor
    Braian Mellor over 6 years
    link Permission Denied
  • Nicolas
    Nicolas about 6 years