У меня есть модель с некоторыми зашифрованными полями, на postLoad я зашифровываю поля (работает хорошо) и пытаюсь создать новый документ (журнал для отслеживания чтения).
Моя проблема в том, что если я добавляю свой новый документ журнала в этот postLoad, запускается предварительное обновление для моей модели, и я не понимаю, почему. Модель не изменилась (гидратированные зашифрованные поля - NotSaved), и даже если она изменилась, в postLoad она не должна запускать другое обновление?
Спасибо за ваши идеи.
(php 7.1 с адаптером alcaeus / mongo-php).
РЕДАКТИРОВАТЬ: Добавление некоторых точности:
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-> запись создает новый документ журнала (который не реализует CryptedDocumentInterface) и сохраняет его. Как вы можете видеть, он сбрасывается в postLoad.
В журналах я вижу, что документ журнала правильно вставлен, и после этого запускается предварительное обновление для зашифрованного документа, который я прочитал.
Вот предварительное обновление:
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());
}
}