diff --git a/src/Doctrine/PolyglotListener.php b/src/Doctrine/PolyglotListener.php index 58bc292..37d2066 100644 --- a/src/Doctrine/PolyglotListener.php +++ b/src/Doctrine/PolyglotListener.php @@ -10,13 +10,14 @@ 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 WeakMap; use Webfactory\Bundle\PolyglotBundle\Locale\DefaultLocaleProvider; final class PolyglotListener @@ -39,9 +40,9 @@ final class PolyglotListener private array $translatedClasses = []; /** - * @var array + * @var WeakMap */ - private array $entitiesWithTranslatables = []; + private WeakMap $entitiesWithTranslatables; /** * @var list @@ -53,6 +54,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 +76,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 +88,7 @@ private function injectPersistentTranslatables(EntityManager $entityManager, obj } if ($hasTranslatables) { - $this->entitiesWithTranslatables[] = WeakReference::create($object); + $this->entitiesWithTranslatables[$object] = true; } } @@ -85,13 +96,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);