いくつかの暗号化されたフィールドを持つモデルがあり、postLoad でフィールドの暗号化を解除し (うまく機能します)、新しいドキュメント (読み取りを追跡するためのログ) を作成しようとします。
私の問題は、新しいログ ドキュメントをこの postLoad にフラッシュすると、モデルの preUpdate がトリガーされ、その理由がわかりません。モデルは変更されていません (ハイドレートされた暗号化されたフィールドは NotSaved です)。変更されたとしても、postLoad に別の更新をトリガーするべきではありませんか?
アイデアをありがとう。
(alcaeus/mongo-php-adapter を使用した php 7.1)。
EDIT:いくつかの精度を追加:
postLoadListener :
public function postLoad(LifecycleEventArgs $eventArgs) {
$document = $eventArgs->getDocument();
if ($document instanceof CryptedDocumentInterface) {
$dm = $eventArgs->getDocumentManager();
$this->cryptService->uncryptDocument($document);
$this->logManager->record($document->getUser(), $document->getCryptedType(), null, null, $document->getId());
$dm->flush();
}
}
uncryptDocument メソッドは、暗号化されたパラメーターのシリアル化された json を復号化し、それでドキュメントをハイドレートします。これらのパラメーターは @ODM\NotSaved です。したがって、ドキュメントは更新されるべきではありません。
logManager->record は、新しいログ ドキュメント (CryptedDocumentInterface を実装していません) を作成し、それを永続化します。ご覧のとおり、postLoad にフラッシュされます。
ログを見ると、ログ ドキュメントが正しく挿入され、その後、読み取った暗号化されたドキュメントに対して preUpdate がトリガーされます。preUpdate は次のとおりです。
public function preUpdate(LifecycleEventArgs $eventArgs) {
$document = $eventArgs->getDocument();
if ($document instanceof CryptedDocumentInterface) {
$this->monolog->debug(__METHOD__ . ' ' . get_class($document) . ' id : ' . $document->getId()); // The id of the document I read.
$values = $this->cryptService->cryptDocument($document);
$dm = $eventArgs->getDocumentManager();
$class = $dm->getClassMetadata(get_class($document));
$dm->getUnitOfWork()->recomputeSingleDocumentChangeSet($class, $document);
$this->logManager->record($document->getUser(), $document->getCryptedType(), $values['oldValue'], $values['newValue'], $document->getId());
}
}