Я создаю приложение CLI для своего приложения, используя Symfony Console . Приложение должно выполнять некоторые простые операции управления пакетами для управления плагинами. Поэтому мне нужна опция команды --version
с ярлыком -v
, которая, похоже, невозможен, поскольку --version
зарезервировано для версии приложения, а -v
зарезервировано для параметра детализации по умолчанию.
Как я могу отключить параметры по умолчанию или перезаписать их для этой подкоманды?
Ошибка появления состояний
[Symfony \ Component \ Console \ Exception \ LogicException] Опция с именем «версия» уже существует.
Итак, вот решение, которое работает, но я не рекомендую его. Я рекомендую вам просто использовать --package-version
или какой-то другой вариант для вашей команды, потому что для этого требуется много дополнительной работы и не подходит для будущих обновлений Symfony.
Первое, что вы можете сделать, это скопировать команду console
в свой каталог bin/
в новую команду и изменить оператор use
на свое собственное расширенное приложение:
// 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
изменится в будущем, или `вам придется вручную обновлять эти файлы, так как вы их переопределите.