diff --git a/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php b/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php index 16a37b524acc6..b6946cc4dec56 100644 --- a/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php +++ b/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php @@ -75,7 +75,7 @@ private function addTaggedServices(ContainerBuilder $container): array $listenerTag = $this->tagPrefix.'.event_listener'; $subscriberTag = $this->tagPrefix.'.event_subscriber'; $listenerRefs = []; - $taggedServices = $this->findAndSortTags([$subscriberTag, $listenerTag], $container); + $taggedServices = $this->findAndSortTags($subscriberTag, $listenerTag, $container); $managerDefs = []; foreach ($taggedServices as $taggedSubscriber) { @@ -144,12 +144,17 @@ private function getEventManagerDef(ContainerBuilder $container, string $name): * @see https://bugs.php.net/53710 * @see https://bugs.php.net/60926 */ - private function findAndSortTags(array $tagNames, ContainerBuilder $container): array + private function findAndSortTags(string $subscriberTag, string $listenerTag, ContainerBuilder $container): array { $sortedTags = []; - - foreach ($tagNames as $tagName) { - foreach ($container->findTaggedServiceIds($tagName, true) as $serviceId => $tags) { + $taggedIds = [ + $subscriberTag => $container->findTaggedServiceIds($subscriberTag, true), + $listenerTag => $container->findTaggedServiceIds($listenerTag, true), + ]; + $taggedIds[$subscriberTag] = array_diff_key($taggedIds[$subscriberTag], $taggedIds[$listenerTag]); + + foreach ($taggedIds as $tagName => $serviceIds) { + foreach ($serviceIds as $serviceId => $tags) { foreach ($tags as $attributes) { $priority = $attributes['priority'] ?? 0; $sortedTags[$priority][] = [$tagName, $serviceId, $attributes]; @@ -157,11 +162,8 @@ private function findAndSortTags(array $tagNames, ContainerBuilder $container): } } - if ($sortedTags) { - krsort($sortedTags); - $sortedTags = array_merge(...$sortedTags); - } + krsort($sortedTags); - return $sortedTags; + return array_merge(...$sortedTags); } } diff --git a/src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php b/src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php index 02cd5acf0365d..d2b3473fba880 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php @@ -454,6 +454,44 @@ public function testProcessEventSubscribersAndListenersWithPriorities() ); } + public function testSubscribersAreSkippedIfListenerDefinedForSameDefinition() + { + $container = $this->createBuilder(); + + $container + ->register('a', 'stdClass') + ->setPublic(false) + ->addTag('doctrine.event_listener', [ + 'event' => 'bar', + 'priority' => 3, + ]) + ; + $container + ->register('b', 'stdClass') + ->setPublic(false) + ->addTag('doctrine.event_listener', [ + 'event' => 'bar', + ]) + ->addTag('doctrine.event_listener', [ + 'event' => 'foo', + 'priority' => -5, + ]) + ->addTag('doctrine.event_subscriber') + ; + $this->process($container); + + $eventManagerDef = $container->getDefinition('doctrine.dbal.default_connection.event_manager'); + + $this->assertEquals( + [ + [['bar'], 'a'], + [['bar'], 'b'], + [['foo'], 'b'], + ], + $eventManagerDef->getArgument(1) + ); + } + public function testProcessNoTaggedServices() { $container = $this->createBuilder(true); 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