Как добавить новую опцию во все консольные команды в Symfony 3

Иногда требуется добавить опцию или аргумент в консольные команды, но прописывать в каждую команду, если их 100+ или это вендорные консольные команды , долго или невозможно. Хорошим решением в данном случае будет использование слушателя событий.

<?php
declare(strict_types=1);

namespace AppBundle\Listener;

use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

class ConsoleCommandListener
{
    /**
     * @param ConsoleCommandEvent $event
     */
    public function onConsoleCommand(ConsoleCommandEvent $event): void
    {
        // добавление опции в консольную команду
        $this->addCommandOption($event->getCommand()->getDefinition());
        // добавление опции в консольное приложение
        // без этого опция не будет отображаться в справке, например, cache:clear --help
        $this->addCommandOption($event->getCommand()->getApplication()->getDefinition());

        // объединение опций команды и приложения
        $event->getCommand()->mergeApplicationDefinition(true);

        $input = new ArgvInput();
        $input->bind($event->getCommand()->getDefinition());
    }

    /**
     * @param InputDefinition $inputDefinition
     */
    private function addCommandOption(InputDefinition $inputDefinition): void
    {
        $inputDefinition->addOption(
            new InputOption(
                'custom_command_option',
                null,
                InputOption::VALUE_OPTIONAL,
                'Console command option description',
                null
            )
        );
    }
}

Конфигурация сервиса

app.console_command_listener:
    class: AppBundle\Listener\ConsoleCommandListener
    arguments: []
    tags:
        - { name: kernel.event_listener, event: console.command, method: onConsoleCommand }

 

Теперь использование опции

php bin/console cache:clear --custom_command_option=value

не вызовет ошибку

The "--custom_command_option" option does not exist.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code