Nouveau dans Symfony 8.2 (en développement). Les commandes de la console se rangent par espaces de noms séparés par des deux-points (cache:clear). Symfony 8.2 accepte aussi la forme de Docker ou de Git, avec des espaces : bin/console cache clear lance cache:clear. Surtout, chaque niveau lit ses propres options.
Avant
Chaque commande d'un groupe redéclare la même option :
bin/console tenant:users:list --tenant=acme bin/console tenant:users:count --tenant=acme
Depuis Symfony 8.2
Le groupe déclare l'option une seule fois, dans son #[AsCommand], et les sous-commandes la lisent dans la chaîne des commandes résolues :
bin/console tenant --name=acme users list
#[AsCommand('tenant', options: [ new InputOption('name', null, InputOption::VALUE_REQUIRED, 'Le nom du tenant'), ])] class TenantCommands { #[AsCommand('users:list')] public function listUsers(CommandChain $chain, OutputInterface $output): int { $tenant = $chain->getInput('tenant')?->getOption('name'); // … } }
Une sous-commande n'hérite pas des options de son parent : elle les lit avec CommandChain::getInput(). Le parent ne fait partie de la chaîne que dans la forme avec espaces. Lancée en tenant:users:list, la commande ne le trouve pas : getInput('tenant') renvoie null.
À faire
Dans TenantCommands, remplacez l'option --tenant des deux sous-commandes par une option --name déclarée une seule fois sur le groupe tenant. Sans groupe (tenant:users:list), le tenant reste default.
Pour essayer dans la console : bin/console tenant --name=acme users list, puis bin/console tenant, qui liste ses sous-commandes.