Wpis z mikrobloga

#php #symfony #doctrine

Używam EntityListener, w postLoad robie deszyfrowanie, w prePersist / preUpdate szyfrowanie pola x.
Generalnie działa to dobrze, ale w preUpdate zawartość changeset - x - oldValue jest zaszyfrowana, tak jakby postLoad w ogóle było ominięte, tak ma to działać? Jak robię dump w odpowiednich momentach wszystko jest ok.

Czyli
1) postLoad, x=1
1) dump - pole x jest odszyfrowane - OK
2) zmieniam x=2 - flush i teraz:
- getEntityChangeSet w preUpdate pokazuje oldValue zaszyfrowane (dlaczego nie odszyfrowane po postLoad?), newValue=2
- dump encji pokazuje x=2
3) pole x poprawnie zapisuje się z nową zaszyfrowaną wartością.
  • 8
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@gajowy_marucha: btw. prePersist jest w momencie wywołania ->persist() a preUpdate w momencie flush().
Trochę z-----i. Dla tego lepiej wpiąć się w preFlush i w nim ogarnąć oba przypadki (o ile nie pojdziesz w strone customoweog pola)
  • Odpowiedz
@bmLq: niestety nie działa to jak powinno. Fragment onFlush:

if ($oldValueDecrypted == $args->getNewValue('data')) {
#czyli wartość się nie zmieniła, próbuję anulować zmianę pola:
subject->setData($args->getOldValue('data));
  • Odpowiedz
@gajowy_marucha: W sumie nie prościej będzie dodać sobie niemapowane pole w encji np. twojePoleDecrypted. I w nie wrzucić odszyfrowaną wartość? W ten sposób odszyfrowanie w postLoad nie będzie nakręcać unitOfWork do aktualizowania encji pomimo, że się nie zmieniła (tzn. zmieniła się na odszyfrowaną).
  • Odpowiedz
@gajowy_marucha:
setField(string $value) {
$this->field = $value;
$this->setFieldEncrypted(null); // trigger change on mapped field so onFlush can update encrypted value
  • Odpowiedz