Skip to content

Latest commit

 

History

History
127 lines (99 loc) · 3.4 KB

symfony_container.md

File metadata and controls

127 lines (99 loc) · 3.4 KB

Symfony container locator

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.

Called object

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' ] ]

Method of class

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' ] ]

Subscriber

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' ] ]

Tagging

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()]);
        }
    }
}