Новое в Symfony 5.3: Параметры команды отрицания

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