1

私はクラスバリデータをサービスとして書き、ドクトリンエンティティマネージャをこのバリデータに渡しました。この時点で、すべてが正常に機能します。

しかし今、フォームで更新された $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)。しかし、バリデーターで内部教義メソッドを使用するのは良い考えではないと思います!

では、クラスバリデーターで元のオブジェクトまたは変更セットを取得するにはどうすればよいでしょうか?

4

1 に答える 1

1

これは元のエンティティを取得しませんが、元のフィールドのキー/値配列を取得する必要があります。

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

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

于 2015-12-14T22:38:40.967 に答える