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
@gajowy_marucha: btw. prePersist jest w momencie wywołania ->persist() a preUpdate w momencie flush().
Trochę #!$%@?. Dla tego lepiej wpiąć się w preFlush i w nim ogarnąć oba przypadki (o ile nie pojdziesz w strone customoweog pola)
@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));
$uow->recomputeSingleEntityChangeSet($meta, $subject);
}

Ale nic to nie daje, update i tak zachodzi.
@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ą).
@gajowy_marucha:
setField(string $value) {
$this->field = $value;
$this->setFieldEncrypted(null); // trigger change on mapped field so onFlush can update encrypted value
}

onFlushEvent...
$entity->setFieldEncrypted($this->encryptor->encrypt($entity->getField()));

Na 1 polu chyba się nie da bo recomputeEntityChangesSet() CHYBA (nie sprawdziłem na 100%) tylko merguje nową zmianę i starą (nawet jeżeli ustawisz oryginalną wartośc). zobacz sobie zawartość tej metody:
[...]
if (isset($this->entityChangeSets[$oid])) {
$this->entityChangeSets[$oid] = array_merge($this->entityChangeSets[$oid], $changeSet);
[...]

w ogóle z czego wynika zapotrzebowanie na takie szyfrowanie?