44
55namespace Gember \EventSourcingSymfonyBundle ;
66
7+ use Gember \EventSourcing \UseCase \Attribute \DomainCommandHandler ;
8+ use Gember \EventSourcing \UseCase \CommandHandler \UseCaseCommandHandler ;
79use Symfony \Component \Config \Definition \Configurator \DefinitionConfigurator ;
10+ use Symfony \Component \DependencyInjection \ChildDefinition ;
811use Symfony \Component \DependencyInjection \ContainerBuilder ;
912use Symfony \Component \DependencyInjection \Loader \Configurator \ContainerConfigurator ;
1013use Symfony \Component \HttpKernel \Bundle \AbstractBundle ;
1114use Override ;
15+ use ReflectionMethod ;
1216
1317final class GemberEventSourcingBundle extends AbstractBundle
1418{
@@ -32,11 +36,24 @@ public function configure(DefinitionConfigurator $definition): void
3236 ->end ()
3337 ->end ()
3438 ->end ()
35- ->arrayNode ('event_registry ' )
39+ ->arrayNode ('registry ' )
3640 ->children ()
37- ->arrayNode ('reflector ' )
41+ ->arrayNode ('event ' )
3842 ->children ()
39- ->scalarNode ('path ' )->end ()
43+ ->arrayNode ('reflector ' )
44+ ->children ()
45+ ->scalarNode ('path ' )->end ()
46+ ->end ()
47+ ->end ()
48+ ->end ()
49+ ->end ()
50+ ->arrayNode ('command_handler ' )
51+ ->children ()
52+ ->arrayNode ('reflector ' )
53+ ->children ()
54+ ->scalarNode ('path ' )->end ()
55+ ->end ()
56+ ->end ()
4057 ->end ()
4158 ->end ()
4259 ->end ()
@@ -46,6 +63,7 @@ public function configure(DefinitionConfigurator $definition): void
4663 ->arrayNode ('symfony ' )
4764 ->children ()
4865 ->scalarNode ('event_bus ' )->end ()
66+ ->scalarNode ('command_bus ' )->end ()
4967 ->end ()
5068 ->end ()
5169 ->end ()
@@ -91,8 +109,11 @@ public function loadExtension(array $config, ContainerConfigurator $container, C
91109 $ services = $ container ->services ();
92110
93111 if ($ config ['cache ' ]['enabled ' ] ?? false ) {
94- $ services ->get ('gember.event_sourcing.registry.cached.cached_event_registry_decorator ' )
95- ->decorate ('gember.event_sourcing.registry.event_registry ' );
112+ $ services ->get ('gember.event_sourcing.registry.event.cached.cached_event_registry_decorator ' )
113+ ->decorate ('gember.event_sourcing.registry.event.event_registry ' );
114+
115+ $ services ->get ('gember.event_sourcing.registry.command_handler.cached.cached_command_handler_registry_decorator ' )
116+ ->decorate ('gember.event_sourcing.registry.command_handler.command_handler_registry ' );
96117
97118 $ services ->get ('gember.event_sourcing.util.resolver.cached.cached_attribute_resolver_decorator ' )
98119 ->decorate ('gember.event_sourcing.util.attribute.resolver.attribute_resolver ' );
@@ -115,8 +136,11 @@ public function loadExtension(array $config, ContainerConfigurator $container, C
115136 $ services ->remove ('gember.psr.cache.cache_item_pool_interface ' );
116137 }
117138
118- $ services ->get ('gember.event_sourcing.registry.event_registry ' )
119- ->arg ('$path ' , $ config ['registry ' ]['event_registry ' ]['reflector ' ]['path ' ] ?? '%kernel.project_dir%/src ' );
139+ $ services ->get ('gember.event_sourcing.registry.event.event_registry ' )
140+ ->arg ('$path ' , $ config ['registry ' ]['event ' ]['reflector ' ]['path ' ] ?? '%kernel.project_dir%/src ' );
141+
142+ $ services ->get ('gember.event_sourcing.registry.command_handler.command_handler_registry ' )
143+ ->arg ('$path ' , $ config ['registry ' ]['command_handler ' ]['reflector ' ]['path ' ] ?? '%kernel.project_dir%/src ' );
120144
121145 if (!empty ($ config ['message_bus ' ]['symfony ' ]['event_bus ' ] ?? null )) {
122146 $ services ->alias (
@@ -145,5 +169,22 @@ public function loadExtension(array $config, ContainerConfigurator $container, C
145169 ltrim ($ config ['serializer ' ]['symfony ' ]['serializer ' ], '@ ' ),
146170 );
147171 }
172+
173+ $ builder ->registerAttributeForAutoconfiguration (
174+ DomainCommandHandler::class,
175+ function (ChildDefinition $ definition , DomainCommandHandler $ attribute , ReflectionMethod $ reflector ) use ($ builder , $ config ): void {
176+ $ parameter = $ reflector ->getParameters ()[0 ];
177+
178+ $ bus = $ config ['message_bus ' ]['symfony ' ]['command_bus ' ] ?? 'command.bus ' ;
179+
180+ $ builder
181+ ->getDefinition (UseCaseCommandHandler::class)
182+ ->addTag ('messenger.message_handler ' , [
183+ 'bus ' => str_starts_with ($ bus , '@ ' ) ? substr ($ bus , 1 ) : $ bus ,
184+ 'handles ' => $ parameter ->getType ()->getName (),
185+ 'method ' => '__invoke ' ,
186+ ]);
187+ },
188+ );
148189 }
149190}
0 commit comments