Trabajar con UnitOfWork
y computeChangeSets
dentro de un escucha de eventos de Doctrine es probablemente el método preferido.
Sin embargo : si desea persistir y vaciar una nueva entidad dentro de este oyente, puede enfrentarse a muchas molestias. Como parece, el único oyente adecuado sería onFlush
con su propio conjunto de problemas.
Entonces sugiero una comparación simple pero liviana, que se puede usar dentro de los Controladores e incluso en los Servicios simplemente inyectando el EntityManagerInterface
(inspirado en @Mohamed Ramrami en la publicación anterior):
$uow = $entityManager->getUnitOfWork();
$originalEntityData = $uow->getOriginalEntityData($blog);
$defaultContext = [
AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object, $format, $context) {
return $object->getId();
},
];
$normalizer = new Serializer([new DateTimeNormalizer(), new ObjectNormalizer(null, null, null, null, null, null, $defaultContext)]);
$yourEntityNormalized = $normalizer->normalize();
$originalNormalized = $normalizer->normalize($originalEntityData);
$changed = [];
foreach ($originalNormalized as $item=>$value) {
if(array_key_exists($item, $yourEntityNormalized)) {
if($value !== $yourEntityNormalized[$item]) {
$changed[] = $item;
}
}
}
Nota : compara cadenas, fechas, bools, enteros y flotantes correctamente, pero falla en los objetos (debido a los problemas de referencia circular). Uno podría comparar estos objetos con más profundidad, pero, por ejemplo, para la detección de cambios de texto, esto es suficiente y mucho más simple que manejar Event Listeners.
Más información: