我已经编写了一个类验证器作为服务并将理论实体管理器传递给这个验证器。此时一切正常。
但现在我需要 $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)
. 但我认为在验证器中使用内部学说方法不是一个好主意!
那么如何在类验证器中获取原始对象或更改集?