Doctrine-MongoDB postLoad запускает предварительное обновление при создании нового документа - PullRequest
0 голосов
/ 15 марта 2019

У меня есть модель с некоторыми зашифрованными полями, на 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());
    }
}

1 Ответ

0 голосов
/ 21 марта 2019

Итак, я решил эту проблему, сохранив / сбросив мой журнал в другой экземпляр DocumentManager.LogManager :: record создает DM, сохраняет и очищает мой журнал.Это не влияет на DM приложения.

...