From ec4ec8fd58b39891b1172af10e14fcf1b18f7f2c Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Fri, 10 Apr 2026 16:55:25 +0200 Subject: [PATCH 1/2] Avoid duplicate processing of entities in certain situations --- src/Doctrine/PolyglotListener.php | 26 +++++++++++++++----------- src/Resources/config/services.php | 1 + 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Doctrine/PolyglotListener.php b/src/Doctrine/PolyglotListener.php index 58bc292..2166dae 100644 --- a/src/Doctrine/PolyglotListener.php +++ b/src/Doctrine/PolyglotListener.php @@ -10,13 +10,13 @@ namespace Webfactory\Bundle\PolyglotBundle\Doctrine; use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Event\OnClearEventArgs; use Doctrine\ORM\Event\PostFlushEventArgs; use Doctrine\ORM\Event\PreFlushEventArgs; use Doctrine\Persistence\Event\LifecycleEventArgs; use Doctrine\Persistence\Mapping\RuntimeReflectionService; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; -use WeakReference; use Webfactory\Bundle\PolyglotBundle\Locale\DefaultLocaleProvider; final class PolyglotListener @@ -39,9 +39,9 @@ final class PolyglotListener private array $translatedClasses = []; /** - * @var array + * @var \WeakMap */ - private array $entitiesWithTranslatables = []; + private \WeakMap $entitiesWithTranslatables; /** * @var list @@ -53,6 +53,12 @@ public function __construct( private readonly LoggerInterface $logger = null ?? new NullLogger(), private readonly RuntimeReflectionService $reflectionService = new RuntimeReflectionService(), ) { + $this->entitiesWithTranslatables = new \WeakMap(); + } + + public function onClear(OnClearEventArgs $args): void + { + $this->entitiesWithTranslatables = new \WeakMap(); } public function postLoad(LifecycleEventArgs $event): void @@ -69,6 +75,10 @@ public function prePersist(LifecycleEventArgs $event): void private function injectPersistentTranslatables(EntityManager $entityManager, object $object): void { + if (isset($this->entitiesWithTranslatables[$object])) { + return; + } + $hasTranslatables = false; foreach ($this->getTranslationMetadatas($object, $entityManager) as $tm) { @@ -77,7 +87,7 @@ private function injectPersistentTranslatables(EntityManager $entityManager, obj } if ($hasTranslatables) { - $this->entitiesWithTranslatables[] = WeakReference::create($object); + $this->entitiesWithTranslatables[$object] = true; } } @@ -85,13 +95,7 @@ public function preFlush(PreFlushEventArgs $event): void { $em = $event->getObjectManager(); - foreach ($this->entitiesWithTranslatables as $key => $weakRef) { - $object = $weakRef->get(); - if (null === $object) { - unset($this->entitiesWithTranslatables[$key]); - continue; - } - + foreach ($this->entitiesWithTranslatables as $object => $ignored) { foreach ($this->getTranslationMetadatas($object, $em) as $tm) { $this->ejectedTranslatables = array_merge($this->ejectedTranslatables, $tm->ejectPersistentTranslatables($object)); } diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php index c47bd51..2798581 100644 --- a/src/Resources/config/services.php +++ b/src/Resources/config/services.php @@ -15,6 +15,7 @@ ->tag('doctrine.event_listener', ['priority' => -100, 'event' => 'prePersist']) ->tag('doctrine.event_listener', ['priority' => -100, 'event' => 'preFlush']) ->tag('doctrine.event_listener', ['priority' => -100, 'event' => 'postLoad']) + ->tag('doctrine.event_listener', ['priority' => -100, 'event' => 'onClear']) ->tag('monolog.logger', ['channel' => 'webfactory_polyglot_bundle']); $services->set(\Webfactory\Bundle\PolyglotBundle\EventListener\LocaleListener::class); From b78315599ef46e3ee1b314115b78851182bb9593 Mon Sep 17 00:00:00 2001 From: mpdude <1202333+mpdude@users.noreply.github.com> Date: Fri, 10 Apr 2026 14:58:39 +0000 Subject: [PATCH 2/2] Fix CS with PHP-CS-Fixer --- src/Doctrine/PolyglotListener.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Doctrine/PolyglotListener.php b/src/Doctrine/PolyglotListener.php index 2166dae..37d2066 100644 --- a/src/Doctrine/PolyglotListener.php +++ b/src/Doctrine/PolyglotListener.php @@ -17,6 +17,7 @@ use Doctrine\Persistence\Mapping\RuntimeReflectionService; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; +use WeakMap; use Webfactory\Bundle\PolyglotBundle\Locale\DefaultLocaleProvider; final class PolyglotListener @@ -39,9 +40,9 @@ final class PolyglotListener private array $translatedClasses = []; /** - * @var \WeakMap + * @var WeakMap */ - private \WeakMap $entitiesWithTranslatables; + private WeakMap $entitiesWithTranslatables; /** * @var list @@ -53,12 +54,12 @@ public function __construct( private readonly LoggerInterface $logger = null ?? new NullLogger(), private readonly RuntimeReflectionService $reflectionService = new RuntimeReflectionService(), ) { - $this->entitiesWithTranslatables = new \WeakMap(); + $this->entitiesWithTranslatables = new WeakMap(); } public function onClear(OnClearEventArgs $args): void { - $this->entitiesWithTranslatables = new \WeakMap(); + $this->entitiesWithTranslatables = new WeakMap(); } public function postLoad(LifecycleEventArgs $event): void