В некоторых консольных командах принято определять две связанные опции с противоположным поведением. Например, параметры по умолчанию, применяемые ко всем командам Symfony, включают параметры --ansi
и --no-ansi
:
// ...
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;
class SomeCommand extends Command
{
// ...
protected function configure(): void
{
$this
// ...
->addOption('ansi', null, InputOption::VALUE_NONE, 'Force ANSI output')
->addOption('no-ansi', null, InputOption::VALUE_NONE, 'Disable ANSI output')
;
}
}
В Symfony 5.3 представили отрицательные параметры команд, чтобы упростить эти команды. Один отрицательный параметр создает в команде два параметра по шаблону --xxx
и --no-xxx
. На практике следующее эквивалентно предыдущему примеру:
// ...
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class SomeCommand extends Command
{
// ...
protected function configure(): void
{
$this
// ...
->addOption('ansi', null, InputOption::VALUE_NEGATABLE, 'Force/disable ANSI output')
;
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
// if command is run as `command-name`, $useAnsi = null
// if command is run as `command-name --ansi`, $useAnsi = true
// if command is run as `command-name --no-ansi`, $useAnsi = false
$useAnsi = $input->getOption('ansi');
// ...
}
}
Отрицательные параметры доступны только для параметров, которые не позволяют передавать им какое-либо значение (их предыдущий тип должен быть InputOption::VALUE_NONE
).