Skip to content

Commit 5a867c5

Browse files
alli83nicolas-grekas
authored andcommitted
[DoctrineBridge] skip subscriber if listener already defined
1 parent 0d25263 commit 5a867c5

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