Trabajar con UnitOfWorky 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 onFlushcon 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: