Skip to content

Commit d4043bb

Browse files
author
Jeroen de Graaf
committed
Handle new command handler feature
Including: - new configuration options
1 parent 8539f89 commit d4043bb

File tree

3 files changed

+80
-8
lines changed

3 files changed

+80
-8
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ gember_event_sourcing:
2323
message_bus:
2424
symfony:
2525
event_bus: '@event.bus'
26+
command_bus: '@command.bus'
2627
cache:
2728
enabled: true
2829
psr6: '@cache.app'
@@ -44,7 +45,10 @@ gember_event_sourcing:
4445
# Or use Gember alias of @Symfony\Component\Uid\Factory\UlidFactory:
4546
# service: '@gember.identity_generator_symfony.ulid.symfony_ulid_identity_generator'
4647
registry:
47-
event_registry:
48+
event:
49+
reflector:
50+
path: '%kernel.project_dir%/src'
51+
command_handler:
4852
reflector:
4953
path: '%kernel.project_dir%/src'
5054
```

config/services.yaml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,33 @@ services:
7070
- '@.inner'
7171
- '@gember.psr.simple_cache.cache_interface'
7272

73+
gember.event_sourcing.registry.command_handler.command_handler_registry:
74+
class: Gember\EventSourcing\Registry\CommandHandler\Reflector\ReflectorCommandHandlerRegistry
75+
arguments:
76+
- '@gember.event_sourcing.util.file.finder.finder'
77+
- '@gember.event_sourcing.util.file.reflector.reflector'
78+
- '@gember.event_sourcing.resolver.use_case.command_handlers.command_handlers_resolver'
79+
80+
gember.event_sourcing.registry.command_handler.cached.cached_command_handler_registry_decorator:
81+
class: Gember\EventSourcing\Registry\CommandHandler\Cached\CachedCommandHandlerRegistryDecorator
82+
#decorates: gember.event_sourcing.registry.command_handler.command_handler_registry
83+
arguments:
84+
- '@.inner'
85+
- '@gember.psr.simple_cache.cache_interface'
86+
- '@gember.event_sourcing.util.string.friendly_class_namer.friendly_class_namer'
87+
88+
gember.event_sourcing.resolver.use_case.command_handlers.command_handlers_resolver:
89+
class: Gember\EventSourcing\Resolver\UseCase\CommandHandlers\Attribute\AttributeCommandHandlersResolver
90+
arguments:
91+
- '@gember.event_sourcing.util.attribute.resolver.attribute_resolver'
92+
93+
Gember\EventSourcing\UseCase\CommandHandler\UseCaseCommandHandler:
94+
class: Gember\EventSourcing\UseCase\CommandHandler\UseCaseCommandHandler
95+
arguments:
96+
- '@gember.event_sourcing.repository.use_case_repository'
97+
- '@gember.event_sourcing.registry.command_handler.command_handler_registry'
98+
- '@gember.event_sourcing.resolver.domain_message.domain_tags.domain_tags_resolver'
99+
73100
gember.event_sourcing.repository.use_case_repository:
74101
class: Gember\EventSourcing\Repository\EventSourced\EventSourcedUseCaseRepository
75102
arguments:

src/GemberEventSourcingBundle.php

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44

55
namespace Gember\EventSourcingSymfonyBundle;
66

7+
use Gember\EventSourcing\UseCase\Attribute\DomainCommandHandler;
8+
use Gember\EventSourcing\UseCase\CommandHandler\UseCaseCommandHandler;
79
use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
10+
use Symfony\Component\DependencyInjection\ChildDefinition;
811
use Symfony\Component\DependencyInjection\ContainerBuilder;
912
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
1013
use Symfony\Component\HttpKernel\Bundle\AbstractBundle;
1114
use Override;
15+
use ReflectionMethod;
1216

1317
final 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

Comments
 (0)