Иногда требуется добавить опцию или аргумент в консольные команды, но прописывать в каждую команду, если их 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.