Skip to content

Commit 218dfaa

Browse files
committed
bug #50224 [DoctrineBridge] skip subscriber if listener already defined (alli83)
This PR was merged into the 6.3 branch. Discussion ---------- [DoctrineBridge] skip subscriber if listener already defined | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | no | New feature? | no | Deprecations? | | Tickets | | License | MIT | Doc PR | Following #49918 and doctrine/DoctrineBundle#1650 skip doctrine event subscriber if a doctrine event listener is already defined for the same definition. Commits ------- 5a867c5 [DoctrineBridge] skip subscriber if listener already defined
2 parents 32dc97a + 5a867c5 commit 218dfaa

File tree

2 files changed

+50
-10
lines changed

2 files changed

+50
-10
lines changed

src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private function addTaggedServices(ContainerBuilder $container): array
7575
$listenerTag = $this->tagPrefix.'.event_listener';
7676
$subscriberTag = $this->tagPrefix.'.event_subscriber';
7777
$listenerRefs = [];
78-
$taggedServices = $this->findAndSortTags([$subscriberTag, $listenerTag], $container);
78+
$taggedServices = $this->findAndSortTags($subscriberTag, $listenerTag, $container);
7979

8080
$managerDefs = [];
8181
foreach ($taggedServices as $taggedSubscriber) {
@@ -144,24 +144,26 @@ private function getEventManagerDef(ContainerBuilder $container, string $name):
144144
* @see https://bugs.php.net/53710
145145
* @see https://bugs.php.net/60926
146146
*/
147-
private function findAndSortTags(array $tagNames, ContainerBuilder $container): array
147+
private function findAndSortTags(string $subscriberTag, string $listenerTag, ContainerBuilder $container): array
148148
{
149149
$sortedTags = [];
150-
151-
foreach ($tagNames as $tagName) {
152-
foreach ($container->findTaggedServiceIds($tagName, true) as $serviceId => $tags) {
150+
$taggedIds = [
151+
$subscriberTag => $container->findTaggedServiceIds($subscriberTag, true),
152+
$listenerTag => $container->findTaggedServiceIds($listenerTag, true),
153+
];
154+
$taggedIds[$subscriberTag] = array_diff_key($taggedIds[$subscriberTag], $taggedIds[$listenerTag]);
155+
156+
foreach ($taggedIds as $tagName => $serviceIds) {
157+
foreach ($serviceIds as $serviceId => $tags) {
153158
foreach ($tags as $attributes) {
154159
$priority = $attributes['priority'] ?? 0;
155160
$sortedTags[$priority][] = [$tagName, $serviceId, $attributes];
156161
}
157162
}
158163
}
159164

160-
if ($sortedTags) {
161-
krsort($sortedTags);
162-
$sortedTags = array_merge(...$sortedTags);
163-
}
165+
krsort($sortedTags);
164166

165-
return $sortedTags;
167+
return array_merge(...$sortedTags);
166168
}
167169
}

src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,44 @@ public function testProcessEventSubscribersAndListenersWithPriorities()
454454
);
455455
}
456456

457+
public function testSubscribersAreSkippedIfListenerDefinedForSameDefinition()
458+
{
459+
$container = $this->createBuilder();
460+
461+
$container
462+
->register('a', 'stdClass')
463+
->setPublic(false)
464+
->addTag('doctrine.event_listener', [
465+
'event' => 'bar',
466+
'priority' => 3,
467+
])
468+
;
469+
$container
470+
->register('b', 'stdClass')
471+
->setPublic(false)
472+
->addTag('doctrine.event_listener', [
473+
'event' => 'bar',
474+
])
475+
->addTag('doctrine.event_listener', [
476+
'event' => 'foo',
477+
'priority' => -5,
478+
])
479+
->addTag('doctrine.event_subscriber')
480+
;
481+
$this->process($container);
482+
483+
$eventManagerDef = $container->getDefinition('doctrine.dbal.default_connection.event_manager');
484+
485+
$this->assertEquals(
486+
[
487+
[['bar'], 'a'],
488+
[['bar'], 'b'],
489+
[['foo'], 'b'],
490+
],
491+
$eventManagerDef->getArgument(1)
492+
);
493+
}
494+
457495
public function testProcessNoTaggedServices()
458496
{
459497
$container = $this->createBuilder(true);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy