1010namespace Webfactory \Bundle \PolyglotBundle \Doctrine ;
1111
1212use Doctrine \ORM \EntityManager ;
13+ use Doctrine \ORM \Event \OnClearEventArgs ;
1314use Doctrine \ORM \Event \PostFlushEventArgs ;
1415use Doctrine \ORM \Event \PreFlushEventArgs ;
1516use Doctrine \Persistence \Event \LifecycleEventArgs ;
1617use Doctrine \Persistence \Mapping \RuntimeReflectionService ;
1718use Psr \Log \LoggerInterface ;
1819use Psr \Log \NullLogger ;
19- use WeakReference ;
2020use Webfactory \Bundle \PolyglotBundle \Locale \DefaultLocaleProvider ;
2121
2222final class PolyglotListener
@@ -39,9 +39,9 @@ final class PolyglotListener
3939 private array $ translatedClasses = [];
4040
4141 /**
42- * @var array<WeakReference >
42+ * @var \WeakMap<object, true >
4343 */
44- private array $ entitiesWithTranslatables = [] ;
44+ private \ WeakMap $ entitiesWithTranslatables ;
4545
4646 /**
4747 * @var list<PersistentTranslatable>
@@ -53,6 +53,12 @@ public function __construct(
5353 private readonly LoggerInterface $ logger = null ?? new NullLogger (),
5454 private readonly RuntimeReflectionService $ reflectionService = new RuntimeReflectionService (),
5555 ) {
56+ $ this ->entitiesWithTranslatables = new \WeakMap ();
57+ }
58+
59+ public function onClear (OnClearEventArgs $ args ): void
60+ {
61+ $ this ->entitiesWithTranslatables = new \WeakMap ();
5662 }
5763
5864 public function postLoad (LifecycleEventArgs $ event ): void
@@ -69,6 +75,10 @@ public function prePersist(LifecycleEventArgs $event): void
6975
7076 private function injectPersistentTranslatables (EntityManager $ entityManager , object $ object ): void
7177 {
78+ if (isset ($ this ->entitiesWithTranslatables [$ object ])) {
79+ return ;
80+ }
81+
7282 $ hasTranslatables = false ;
7383
7484 foreach ($ this ->getTranslationMetadatas ($ object , $ entityManager ) as $ tm ) {
@@ -77,21 +87,15 @@ private function injectPersistentTranslatables(EntityManager $entityManager, obj
7787 }
7888
7989 if ($ hasTranslatables ) {
80- $ this ->entitiesWithTranslatables [] = WeakReference:: create ( $ object ) ;
90+ $ this ->entitiesWithTranslatables [$ object ] = true ;
8191 }
8292 }
8393
8494 public function preFlush (PreFlushEventArgs $ event ): void
8595 {
8696 $ em = $ event ->getObjectManager ();
8797
88- foreach ($ this ->entitiesWithTranslatables as $ key => $ weakRef ) {
89- $ object = $ weakRef ->get ();
90- if (null === $ object ) {
91- unset($ this ->entitiesWithTranslatables [$ key ]);
92- continue ;
93- }
94-
98+ foreach ($ this ->entitiesWithTranslatables as $ object => $ ignored ) {
9599 foreach ($ this ->getTranslationMetadatas ($ object , $ em ) as $ tm ) {
96100 $ this ->ejectedTranslatables = array_merge ($ this ->ejectedTranslatables , $ tm ->ejectPersistentTranslatables ($ object ));
97101 }
0 commit comments