Symfony2表单验证Doctrine2对象:访问更新时的先前值

时间:2013-10-31 00:58:10

标签: forms validation symfony doctrine-orm

我已经将类验证器编写为服务,并将doctrine实体管理器传递给此验证器。此时一切正常。

但是现在我需要在表单中更新的$ entry的未更改对象 - 或者至少是之前的值。我尝试了一些方法,但没有成功:

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

Doctrine按预期获取相同(已更改)的对象。但是尝试刷新对象将重置对象的两个版本:

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

    $hoursOfOldEntry = $entry->calculateHours();

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

另一个选项可能是将对象的值保存为数组,刷新对象并在处理原始值后再次重新分配保存的值。但这似乎并不是最好的方式,特别是如果有很多关系的话。我不会在验证器中触摸对象,我只需要以前的值!

另一种方法可能是使用Doctrine\ORM\UnitOfWork#recomputeSingleEntityChangeSet(Doctrine\ORM\ClassMetadata $meta, $entity)。但我不认为在验证器中使用内部学说方法是个好主意!

那么如何在类验证器中获取原始对象或更改集?

1 个答案:

答案 0 :(得分:1)

这不会为您提供原始实体,但应该为您提供原始字段的键/值数组:

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

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