1313
1414use Symfony \Component \DependencyInjection \Compiler \CompilerPassInterface ;
1515use Symfony \Component \DependencyInjection \Compiler \PriorityTaggedServiceTrait ;
16+ use Symfony \Component \DependencyInjection \Compiler \ServiceLocatorTagPass ;
1617use Symfony \Component \DependencyInjection \ContainerBuilder ;
18+ use Symfony \Component \DependencyInjection \Definition ;
1719use Symfony \Component \DependencyInjection \Exception \RuntimeException ;
1820use Symfony \Component \DependencyInjection \Reference ;
21+ use Symfony \Component \Message \Handler \MessageHandlerCollection ;
1922
2023/**
2124 * @author Samuel Roze <samuel.roze@gmail.com>
@@ -53,11 +56,10 @@ public function process(ContainerBuilder $container)
5356 $ busDefinition = $ container ->getDefinition ($ this ->messageBusService );
5457 $ busDefinition ->replaceArgument (0 , $ middlewares );
5558
56- $ handlerResolver = $ container ->getDefinition ($ this ->messageHandlerResolverService );
57- $ handlerResolver ->replaceArgument (0 , $ this ->findHandlers ($ container ));
59+ $ this ->registerHandlers ($ container );
5860 }
5961
60- private function findHandlers (ContainerBuilder $ container ): array
62+ private function registerHandlers (ContainerBuilder $ container )
6163 {
6264 $ handlersByMessage = array ();
6365
@@ -79,7 +81,22 @@ private function findHandlers(ContainerBuilder $container): array
7981 $ handlersByMessage [$ message ] = call_user_func_array ('array_merge ' , $ handlersByMessage [$ message ]);
8082 }
8183
82- return $ handlersByMessage ;
84+ $ definitions = array ();
85+ foreach ($ handlersByMessage as $ message => $ handlers ) {
86+ if (1 === count ($ handlers )) {
87+ $ handlersByMessage [$ message ] = current ($ handlers );
88+ } else {
89+ $ d = new Definition (MessageHandlerCollection::class, array ($ handlers ));
90+ $ d ->setPrivate (true );
91+ $ serviceId = hash ('sha1 ' , $ message );
92+ $ definitions [$ serviceId ] = $ d ;
93+ $ handlersByMessage [$ message ] = new Reference ($ serviceId );
94+ }
95+ }
96+ $ container ->addDefinitions ($ definitions );
97+
98+ $ handlerResolver = $ container ->getDefinition ($ this ->messageHandlerResolverService );
99+ $ handlerResolver ->replaceArgument (0 , ServiceLocatorTagPass::register ($ container , $ handlersByMessage ));
83100 }
84101
85102 private function guessHandledClass (ContainerBuilder $ container , string $ serviceId ): string
0 commit comments