Skip to content

Commit ec4ec8f

Browse files
committed
Avoid duplicate processing of entities in certain situations
1 parent e40e3de commit ec4ec8f

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

src/Doctrine/PolyglotListener.php

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
namespace Webfactory\Bundle\PolyglotBundle\Doctrine;
1111

1212
use Doctrine\ORM\EntityManager;
13+
use Doctrine\ORM\Event\OnClearEventArgs;
1314
use Doctrine\ORM\Event\PostFlushEventArgs;
1415
use Doctrine\ORM\Event\PreFlushEventArgs;
1516
use Doctrine\Persistence\Event\LifecycleEventArgs;
1617
use Doctrine\Persistence\Mapping\RuntimeReflectionService;
1718
use Psr\Log\LoggerInterface;
1819
use Psr\Log\NullLogger;
19-
use WeakReference;
2020
use Webfactory\Bundle\PolyglotBundle\Locale\DefaultLocaleProvider;
2121

2222
final 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
}

src/Resources/config/services.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
->tag('doctrine.event_listener', ['priority' => -100, 'event' => 'prePersist'])
1616
->tag('doctrine.event_listener', ['priority' => -100, 'event' => 'preFlush'])
1717
->tag('doctrine.event_listener', ['priority' => -100, 'event' => 'postLoad'])
18+
->tag('doctrine.event_listener', ['priority' => -100, 'event' => 'onClear'])
1819
->tag('monolog.logger', ['channel' => 'webfactory_polyglot_bundle']);
1920

2021
$services->set(\Webfactory\Bundle\PolyglotBundle\EventListener\LocaleListener::class);

0 commit comments

Comments
 (0)