Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding out what changed via postUpdate listener in Symfony 2.1

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.

like image 321
keybored Avatar asked May 30 '13 19:05

keybored


3 Answers

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());
}
like image 150
Anatoly E Avatar answered Nov 09 '22 17:11

Anatoly E


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;
    }
}
like image 45
Ashton Honnecke Avatar answered Nov 09 '22 17:11

Ashton Honnecke


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

}
like image 9
keybored Avatar answered Nov 09 '22 17:11

keybored