Symfony 8.2 Nouveauté Publié le

Des sous-commandes à la Docker

tenant --name=acme users list : le groupe porte l'option une seule fois, chaque sous-commande la lit dans la chaîne des commandes.

Notions abordées : Console

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.

D'où vient la fonctionnalité : la pull request d'origine.