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

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

Ошибка выскакивает состояния

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

5

Решение

Итак, вот решение, которое работает, но я не рекомендую его. Я рекомендую вам просто использовать --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 изменения в будущем, или вам придется вручную обновлять эти файлы, так как вы переопределите их.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector