Locator is needed for search the handler of handled command.
It's a implementation of locator CommandHandlerLocator
for
Symfony container.
Note
Symfony 3.3 implements a PSR-11. If you are using version Symfony 3.3 or later, you must use a PSR-11 Container locator.
Example register the called object as a command handler:
class RenameArticleHandler
{
public function __invoke(RenameArticleCommand $command): void
{
// do something
}
}
YAML configuration for this:
services:
RenameArticleHandler: ~
GpsLab\Component\Command\Handler\Locator\SymfonyContainerCommandHandlerLocator:
calls:
- [ setContainer, [ '@service_container' ] ]
- [ registerService, [ 'RenameArticleCommand', 'RenameArticleHandler' ] ]
Example register the public method of class as a command handler:
class RenameArticleHandler
{
public function handleRenameArticle(RenameArticleCommand $command): void
{
// do something
}
}
YAML configuration for this:
services:
RenameArticleHandler: ~
GpsLab\Component\Command\Handler\Locator\SymfonyContainerCommandHandlerLocator:
calls:
- [ setContainer, [ '@service_container' ] ]
- [ registerService, [ 'RenameArticleCommand', 'RenameArticleHandler', 'handleRenameArticle' ] ]
Example register a subscriber as a command handler:
class ArticleCommandSubscriber implements CommandSubscriber
{
public static function getSubscribedCommands(): array
{
return [
RenameArticleCommand::class => 'handleRename',
];
}
public function handleRename(RenameArticleCommand $command): void
{
// do something
}
}
YAML configuration for this:
services:
ArticleCommandSubscriber: ~
GpsLab\Component\Command\Handler\Locator\SymfonyContainerCommandHandlerLocator:
calls:
- [ setContainer, [ '@service_container' ] ]
- [ registerSubscriberService, [ 'ArticleCommandSubscriber', 'ArticleCommandSubscriber' ] ]
You can tagged command handler services for optimize register the services in command locator. You can autoconfigure your subscribers and automatically register it in locator like that:
// src/Kernel.php
class Kernel extends BaseKernel
{
protected function build(ContainerBuilder $container): void
{
$container
->registerForAutoconfiguration(CommandSubscriber::class)
->addTag('gpslab.command.subscriber')
;
$locator = $container->findDefinition(SymfonyContainerCommandHandlerLocator::class);
$tagged_subscribers = $container->findTaggedServiceIds('gpslab.command.subscriber');
foreach ($tagged_subscribers as $id => $attributes) {
$subscriber = $container->findDefinition($id);
$locator->addMethodCall('registerSubscriberService', [$id, $subscriber->getClass()]);
}
}
}