Track field changes on Doctrine entity

前端 未结 2 433
悲&欢浪女
悲&欢浪女 2020-12-30 09:21

I want to track changes to a field of a Doctrine Entity. I use Symfony 2.5.0 and Doctrine 2.2.3.

So far i have an EventSubscriber that subscribes to

2条回答
  •  时光说笑
    2020-12-30 09:52

    Don't use preUpdate or postUpdate, you will have problems. Take a look at onFlush instead.

    You have access to the complete changeset at this point, so you can find out what fields have changed, what's been added etc. You can also safely persist new entities. Note as the docs say, you will have to recompute change sets when you persist or change entities.

    Simple example I knocked together, not tested but something similar to this will get you what you want.

    public function onFlush(OnFlushEventArgs $args) {
    
        $entityManager = $args->getEntityManager();
        $unitOfWork = $entityManager->getUnitOfWork();
        $updatedEntities = $unitOfWork->getScheduledEntityUpdates();
    
        foreach ($updatedEntities as $updatedEntity) {
    
            if ($updatedEntity instanceof YourEntity) {
    
                $changeset = $unitOfWork->getEntityChangeSet($updatedEntity);
    
                if (array_key_exists('someFieldInYourEntity', $changeset)) {
    
                    $changes = $changeset['someFieldInYourEntity'];
    
                    $previousValueForField = array_key_exists(0, $changes) ? $changes[0] : null;
                    $newValueForField = array_key_exists(1, $changes) ? $changes[1] : null;
    
                    if ($previousValueForField != $newValueForField) {
    
                        $yourChangeTrackingEntity = new YourChangeTrackingEntity();
                        $yourChangeTrackingEntity->setSomeFieldChanged($previousValueForField);
                        $yourChangeTrackingEntity->setSomeFieldChangedTo($newValueForField);
    
                        $entityManager->persist($yourChangeTrackingEntity);
                        $metaData = $entityManager->getClassMetadata('YourNameSpace\YourBundle\Entity\YourChangeTrackingEntity');
                        $unitOfWork->computeChangeSet($metaData, $yourChangeTrackingEntity);
                    }
                }
            }
        }
    }
    

提交回复
热议问题