Clavat
Clavat

Reputation: 117

Doctrine's hasChangedField to account for changes made in the listener

I have a User entity, and I would like to archive it when banned. I have the following preUpdate listener:

/**
 * @ORM\PreUpdate
 */
public function preUpdate(PreUpdateEventArgs $eventArgs) {
    if ($eventArgs->hasChangedField('banned') {
        $this->setIsArchived(true);
    }

    if ($eventArgs->hasChangedField('isArchived')) {
        /* do Special work here */
    }
}

How do I inform eventArgs about the field changed inside the handler itself?

Upvotes: 2

Views: 2110

Answers (1)

George
George

Reputation: 1489

if you edit an entity within the eventArgs, I think you need to persist it and then run the computeChangeSet or computeChangeSets in the UnitOfWork in order for you to use the hasChangedField:

$entity = $eventArgs->getObject();
$em = $eventArgs->getObjectManager();
$uow = $em->getUnitOfWork();

if ($eventArgs->hasChangedField('banned') {
    $entity->setIsArchived(true);
    $em->persist($entity);
}

$uow->computeChangeSets();

if ($eventArgs->hasChangedField('isArchived')) {
    /* do Special work here */
}

Upvotes: 1

Related Questions