From 9f47f058f2d54371ff17ed33fb49f18281c27b37 Mon Sep 17 00:00:00 2001 From: numew Date: Thu, 23 Jan 2025 16:11:12 +0100 Subject: [PATCH] prevent infinite loop on historyEntry deletion #3576 --- src/EventListener/EntityHistoryListener.php | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/EventListener/EntityHistoryListener.php b/src/EventListener/EntityHistoryListener.php index f921d20b1..956b72126 100644 --- a/src/EventListener/EntityHistoryListener.php +++ b/src/EventListener/EntityHistoryListener.php @@ -17,7 +17,7 @@ #[AsDoctrineListener(event: Events::postPersist)] #[AsDoctrineListener(event: Events::postUpdate)] #[AsDoctrineListener(event: Events::preRemove)] -readonly class EntityHistoryListener +class EntityHistoryListener { public const array FIELDS_TO_IGNORE = [ 'lastLoginAt', @@ -27,13 +27,15 @@ 'lastSuiviIsPublic', ]; + private array $deletedObjects; + public function __construct( - private HistoryEntryManager $historyEntryManager, - private EntityManagerInterface $entityManager, - private EntityComparator $entityComparator, - private LoggerInterface $logger, + private readonly HistoryEntryManager $historyEntryManager, + private readonly EntityManagerInterface $entityManager, + private readonly EntityComparator $entityComparator, + private readonly LoggerInterface $logger, #[Autowire(env: 'HISTORY_TRACKING_ENABLE')] - private string $historyTrackingEnable, + private readonly string $historyTrackingEnable, ) { } @@ -102,13 +104,16 @@ protected function processEntity(LifecycleEventArgs $eventArgs, HistoryEntryEven } } if (HistoryEntryEvent::DELETE === $event) { - $changes = $this->entityComparator->getEntityPropertiesAndValueNormalized($entity); + $className = $this->entityManager->getMetadataFactory()->getMetadataFor($entity::class)->getName(); + if (!isset($this->deletedObjects[$className][$entity->getId()])) { + $this->deletedObjects[$className][$entity->getId()] = $entity; + $changes = $this->entityComparator->getEntityPropertiesAndValueNormalized($entity); + } } if (in_array($event, [HistoryEntryEvent::UPDATE, HistoryEntryEvent::DELETE]) && empty($changes)) { return; } - $this->saveEntityHistory($event, $entity, $changes); }