ck1
ck1

Reputation: 83

Symfony2 form validation of Doctrine2 object: accessing previous values on updates

I've written a class validator as a service and passed the doctrine entity manager to this validator. At this point everything works fine.

But now I need the unchanged object of $entry which is been updated in the form - or at least the previous values. I've tried some approaches, but did not succeed:

public function isValid($entry, Constraint $constraint)
{
    $oldEntry = $this->em->getRepository('SomeBundle:Entry')->findOneBy(array('id' => $entry->getId()));

Doctrine fetches the same (changed) object as expected. But trying to refresh the object will reset both versions of the object:

    $newEntry = clone $entry;
    $this->em->detach($newEntry);
    $this->em->refresh($entry);

    $hoursOfOldEntry = $entry->calculateHours();

    $this->em->merge($newEntry);

Another option could be to save the values of the object as array, refresh the object and reassign the saved values again after working on the original values. But this does not seem to be the best way, especially if the are many relations. I don't wont to touch the object within a validator, I just need the previous values!

Another approach could be using Doctrine\ORM\UnitOfWork#recomputeSingleEntityChangeSet(Doctrine\ORM\ClassMetadata $meta, $entity). But I don't think it's a good idea to use internal doctrine methods in a validator!

So how do I get the original object or the change set in a class validator?

Upvotes: 1

Views: 754

Answers (1)

Omn
Omn

Reputation: 3070

This won't get you the original entity, but should get you a key/value array of the original fields:

$uow = $em->getUnitOfWork();
$originalData = $uow->getOriginalEntityData($entry);

http://www.doctrine-project.org/api/orm/2.0/source-class-Doctrine.ORM.UnitOfWork.html#2210

Upvotes: 1

Related Questions