Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3d4ca5f

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

File tree

2 files changed

+46
-9
lines changed

2 files changed

+46
-9
lines changed

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

Lines changed: 8 additions & 9 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,23 @@ 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+
$taggedIds = [$listenerTag => $container->findTaggedServiceIds($listenerTag, true)];
151+
$taggedIds[$subscriberTag] = array_diff_key($container->findTaggedServiceIds($subscriberTag, true), $taggedIds[$listenerTag]);
150152

151-
foreach ($tagNames as $tagName) {
152-
foreach ($container->findTaggedServiceIds($tagName, true) as $serviceId => $tags) {
153+
foreach ($taggedIds as $tagName => $serviceIds) {
154+
foreach ($serviceIds as $serviceId => $tags) {
153155
foreach ($tags as $attributes) {
154156
$priority = $attributes['priority'] ?? 0;
155157
$sortedTags[$priority][] = [$tagName, $serviceId, $attributes];
156158
}
157159
}
158160
}
159161

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

165-
return $sortedTags;
164+
return array_merge(...$sortedTags);
166165
}
167166
}

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)