another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Есть ли возможность реализовать автовайринг хэндлеров для команд Tactician в Symfony 4?

Symfony 4 + Tactician Bundle.
Всё работает, но не устраивает следующее.
Каждый хэндлер команды должен регистрироваться вручную в конфигурации (services).
Нашёл по этому поводу RFC, который предполагает авторегистрацию хэндлеров (если использовать тайпхинтинг в оных), но, судя по всему, его не реализовали, как я понял.

Есть ли возможность зарегистрировать все хэндлеры, например, по шаблонному имени файла или нэймспэйсу (App\Command\Handlers\*)?
Допускаю что-то подобное:
- команда: App\Command\RegisterUser;
- хэндлер: App\Command\RegisterUserHandler;
То есть в данном случае команда будет автоматически обрабатываться хэндлером с идентичным именем оканчивающемся на Handler.

Спасибо.
  • Вопрос задан
  • 438 просмотров
Решения вопроса 1
myrkoxx
@myrkoxx
developer
Делал как -то так: https://github.com/thephpleague/tactician-bundle#2...

Вот мой services.yaml:

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{Request,Entity,Migrations,Tests,Kernel.php}'

    App\Console\:
        resource: '../src/Console'
        public: true
        tags: ['console.command']

    App\Command\:
        resource: '../src/Command'
        tags:
          - { name: tactician.handler, typehints: true }

    League\Tactician\CommandBus: '@tactician.commandbus'


Собственно теперь все Command находяться в папке src/App/Command, и можно больше не париться. Вот пример использования:

class CreateCliRequest extends ContainerAwareCommand
{
    /**
     * @var CommandBus
     */
    private $commandBus;

    public function __construct(?string $name = null, CommandBus $commandBus)
    {
        parent::__construct($name);

        $this->commandBus = $commandBus;
    }

    protected function configure()
    {
        $this
            ->setName('create:cli:req')
            ->addArgument('name', InputArgument::REQUIRED)
            ->setDescription('Some command');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $request = new CreateRequest(12, $input->getArgument('name'));

        $result = $this->commandBus->handle($request);

        $output
            ->writeln('<info>' .$result . '</info>');
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы