Symfony Console – перезаписать параметры по умолчанию

Я создаю приложение CLI для своего приложения, используя Symfony Console . Приложение должно выполнять некоторые простые операции управления пакетами для управления плагинами. Поэтому мне нужна опция команды --version с ярлыком -v , которая, похоже, невозможен, поскольку --version зарезервировано для версии приложения, а -v зарезервировано для параметра детализации по умолчанию.
Как я могу отключить параметры по умолчанию или перезаписать их для этой подкоманды?

Ошибка появления состояний

[Symfony \ Component \ Console \ Exception \ LogicException] Опция с именем «версия» уже существует.

Итак, вот решение, которое работает, но я не рекомендую его. Я рекомендую вам просто использовать --package-version или какой-то другой вариант для вашей команды, потому что для этого требуется много дополнительной работы и не подходит для будущих обновлений Symfony.

Первое, что вы можете сделать, это скопировать команду console в свой каталог bin/ в новую команду и изменить оператор use на свое собственное расширенное приложение:

бен / alt_console:

 // use Symfony\Bundle\FrameworkBundle\Console\Application; use AppBundle\Console\Application; 

Затем создайте новый класс Application который расширяет существующее приложение Symfony, которое выглядит так:

Заявка:

 namespace AppBundle\Console; use AppBundle\Command\YourCommand; use Symfony\Component\Console\Application; use Symfony\Component\Console\Event\ConsoleErrorEvent; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputDefinition; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class TestApplication extends Application { const NAME = 'Alternative Application'; const VERSION = '1.0'; // these are normally private, but must now be protected as they exist in doRun() protected $command; protected $defaultCommand; protected $dispatcher; protected $runningCommand; /** * {@inheritdoc} */ public function __construct() { parent::__construct(static::NAME, static::VERSION); // manually add the commands you want to be handled by this $this->add(new YourCommand()); } /** * {@inheritdoc} */ public function doRun(InputInterface $input, OutputInterface $output) { /* remove these lines if (true === $input->hasParameterOption(array('--version', '-V'), true)) { $output->writeln($this->getLongVersion()); return 0; } */ // copy the rest of the doRun() function as it // exists in the base Application class // ... } /** * {@inheritdoc} * * Return everything from the default input definition except the 'version' option */ protected function getDefaultInputDefinition() { $definition = []; $defaultDefinition = parent::getDefaultInputDefinition(); foreach ($defaultDefinition->getOptions() as $option) { if ($option->getName() !== 'version') { $definition[] = $option; } } foreach ($defaultDefinition->getArguments() as $argument) { $definition[] = $argument; } return new InputDefinition($definition); } } 

Теперь добавьте свое приложение со своей собственной опцией --version :

 namespace AppBundle\Command; use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class YourCommand extends ContainerAwareCommand { /** * {@inheritdoc} */ protected function configure() { $this ->setName('your:command') ->addOption('--version', '-V', InputOption::VALUE_NONE, 'okay') ; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { if ($input->hasOption('version')) { // do something } } } 

Затем вы можете позвонить своей команде через:

 php bin/console your:command php bin/console your:comand --version 

Обратите внимание, что я НЕ рекомендую это. Это большая часть дополнительной работы, которая почти не выигрывает, кроме сохранения нескольких нажатий клавиш с другим вариантом. Плюс, если bin/console или Symfony\Component\Console\Application изменится в будущем, или `вам придется вручную обновлять эти файлы, так как вы их переопределите.