diff --git a/src/DependencyInjection/Compiler/EventListenerPass.php b/src/DependencyInjection/Compiler/EventListenerPass.php new file mode 100644 index 00000000..41d7c395 --- /dev/null +++ b/src/DependencyInjection/Compiler/EventListenerPass.php @@ -0,0 +1,29 @@ +hasDefinition(DefaultEventBus::class)) { + return; + } + + foreach (array_keys($container->findTaggedServiceIds('event_sourcing.event_listener')) as $id) { + assert(is_string($id)); + $container->getDefinition(DefaultEventBus::class)->addMethodCall('addListener', [new Reference($id)]); + } + } +} diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 5c88eb16..cb654b59 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -38,8 +38,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->end() ->scalarNode('message_bus') - ->isRequired() - ->cannotBeEmpty() + ->defaultNull() ->end() ->arrayNode('aggregates') diff --git a/src/DependencyInjection/PatchlevelEventSourcingExtension.php b/src/DependencyInjection/PatchlevelEventSourcingExtension.php index 441cdf9f..ec254364 100644 --- a/src/DependencyInjection/PatchlevelEventSourcingExtension.php +++ b/src/DependencyInjection/PatchlevelEventSourcingExtension.php @@ -24,6 +24,7 @@ use Patchlevel\EventSourcing\Console\Command\ShowCommand; use Patchlevel\EventSourcing\Console\Command\WatchCommand; use Patchlevel\EventSourcing\Console\DoctrineHelper; +use Patchlevel\EventSourcing\EventBus\DefaultEventBus; use Patchlevel\EventSourcing\EventBus\EventBus; use Patchlevel\EventSourcing\EventBus\Listener; use Patchlevel\EventSourcing\EventBus\SymfonyEventBus; @@ -81,27 +82,42 @@ public function load(array $configs, ContainerBuilder $container): void } /** - * @param array{message_bus: string} $config + * @param array{message_bus: ?string} $config */ private function configureEventBus(array $config, ContainerBuilder $container): void { - $container->register(SymfonyEventBus::class) - ->setArguments([new Reference($config['message_bus'])]); + if ($config['message_bus']) { + $container->register(SymfonyEventBus::class) + ->setArguments([new Reference($config['message_bus'])]); - $container->setAlias(EventBus::class, SymfonyEventBus::class); + $container->setAlias(EventBus::class, SymfonyEventBus::class); + + $container->registerForAutoconfiguration(Listener::class) + ->addTag('messenger.message_handler', ['bus' => $config['message_bus']]); + + return; + } + + $container->register(DefaultEventBus::class); + $container->setAlias(EventBus::class, DefaultEventBus::class); $container->registerForAutoconfiguration(Listener::class) - ->addTag('messenger.message_handler', ['bus' => $config['message_bus']]); + ->addTag('event_sourcing.event_listener'); } /** - * @param array{message_bus: string} $config + * @param array{message_bus: ?string} $config */ private function configureProjection(array $config, ContainerBuilder $container): void { - $container->register(ProjectionListener::class) - ->setArguments([new Reference(ProjectionRepository::class)]) - ->addTag('messenger.message_handler', ['bus' => $config['message_bus']]); + $projectionListener = $container->register(ProjectionListener::class) + ->setArguments([new Reference(ProjectionRepository::class)]); + + if ($config['message_bus']) { + $projectionListener->addTag('messenger.message_handler', ['bus' => $config['message_bus']]); + } else { + $projectionListener->addTag('event_sourcing.event_listener'); + } $container->registerForAutoconfiguration(Projection::class) ->addTag('event_sourcing.projection'); @@ -247,16 +263,21 @@ private function configureCommands(array $config, ContainerBuilder $container): } /** - * @param array{message_bus: string, watch_server: array{host: string}} $config + * @param array{message_bus: ?string, watch_server: array{host: string}} $config */ private function configureWatchServer(array $config, ContainerBuilder $container): void { $container->register(WatchServerClient::class) ->setArguments([$config['watch_server']['host']]); - $container->register(WatchListener::class) - ->setArguments([new Reference(WatchServerClient::class)]) - ->addTag('messenger.message_handler', ['bus' => $config['message_bus']]); + $listener = $container->register(WatchListener::class) + ->setArguments([new Reference(WatchServerClient::class)]); + + if ($config['message_bus']) { + $listener->addTag('messenger.message_handler', ['bus' => $config['message_bus']]); + } else { + $listener->addTag('event_sourcing.event_listener'); + } $container->register(WatchServer::class) ->setArguments([$config['watch_server']['host']]); diff --git a/src/PatchlevelEventSourcingBundle.php b/src/PatchlevelEventSourcingBundle.php index a7b8a337..e4855434 100644 --- a/src/PatchlevelEventSourcingBundle.php +++ b/src/PatchlevelEventSourcingBundle.php @@ -4,8 +4,16 @@ namespace Patchlevel\EventSourcingBundle; +use Patchlevel\EventSourcingBundle\DependencyInjection\Compiler\EventListenerPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; class PatchlevelEventSourcingBundle extends Bundle { + public function build(ContainerBuilder $container): void + { + parent::build($container); + + $container->addCompilerPass(new EventListenerPass()); + } }