13
13
14
14
use Symfony \Component \DependencyInjection \Compiler \CompilerPassInterface ;
15
15
use Symfony \Component \DependencyInjection \Compiler \PriorityTaggedServiceTrait ;
16
+ use Symfony \Component \DependencyInjection \Compiler \ServiceLocatorTagPass ;
16
17
use Symfony \Component \DependencyInjection \ContainerBuilder ;
18
+ use Symfony \Component \DependencyInjection \Definition ;
17
19
use Symfony \Component \DependencyInjection \Exception \RuntimeException ;
18
20
use Symfony \Component \DependencyInjection \Reference ;
21
+ use Symfony \Component \Message \Handler \MessageHandlerCollection ;
19
22
20
23
/**
21
24
* @author Samuel Roze <samuel.roze@gmail.com>
@@ -53,11 +56,10 @@ public function process(ContainerBuilder $container)
53
56
$ busDefinition = $ container ->getDefinition ($ this ->messageBusService );
54
57
$ busDefinition ->replaceArgument (0 , $ middlewares );
55
58
56
- $ handlerResolver = $ container ->getDefinition ($ this ->messageHandlerResolverService );
57
- $ handlerResolver ->replaceArgument (0 , $ this ->findHandlers ($ container ));
59
+ $ this ->registerHandlers ($ container );
58
60
}
59
61
60
- private function findHandlers (ContainerBuilder $ container ): array
62
+ private function registerHandlers (ContainerBuilder $ container )
61
63
{
62
64
$ handlersByMessage = array ();
63
65
@@ -79,7 +81,22 @@ private function findHandlers(ContainerBuilder $container): array
79
81
$ handlersByMessage [$ message ] = call_user_func_array ('array_merge ' , $ handlersByMessage [$ message ]);
80
82
}
81
83
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 ));
83
100
}
84
101
85
102
private function guessHandledClass (ContainerBuilder $ container , string $ serviceId ): string
0 commit comments