我已经将类验证器编写为服务,并将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)
。但我不认为在验证器中使用内部学说方法是个好主意!
那么如何在类验证器中获取原始对象或更改集?
答案 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