New in Symfony 5.3: Negatable Command Options

Symfony 5.3 is backed by:
Warning: This post is about an unsupported Symfony version. Some of this information may be out of date. Read the most recent Symfony Docs.
Contributed by
Greg Anderson
and Jérémy Derussé
in #39642.
In some console commands it's common to define two related options with opposite
behaviors. For example, the default options applied to all Symfony commands
include the --ansi
and --no-ansi
options:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// ...
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')
;
}
}
In Symfony 5.3 we've introduced negatable command options to simplify these
commands. A single negatable option creates two options in the command,
following the pattern --xxx
and --no-xxx
. In practice, the following is
equivalent to the previous example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
// ...
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');
// ...
}
}
Negatable options are only available for options that don't allow passing any
value to them (their previous type should be InputOption::VALUE_NONE
).
Help the Symfony project!
As with any Open-Source project, contributing code or documentation is the most common way to help, but we also have a wide range of sponsoring opportunities.
Comments
Comments are closed.
To ensure that comments stay relevant, they are closed for old posts.
->addOption('ansi', null, InputOption::VALUE_NEGATABLE, 'Force/disable ANSI output' , 'DEFAULT HERE')
but otherwise, false as per @javier
bin/console would then be default as --no-ansi - and therefor all the default commands would run without any color coding.
So get color coding, you need to run bin/console --ansi then?
So, for once, not a great thumbs up from my part. It seems a confusing API that needs documentation to clarify its default behaviour...
3-state boolean would be very useful - I often use this pattern for example for data filtering - aka to get list of activated/deactivated/all users it could be --activated, --no-activated or not defined to get all.
Also - it'd be nice to support also keyword "not" just for better readability (--not-activated instead of --no-activated) but I understand it could be confusing in documentation.
https://github.com/symfony/symfony/pull/40986