Commande console Symfony : écrire une commande avec #[AsCommand]

Une commande console Symfony est une classe marquée #[AsCommand] dont la méthode __invoke() fait le travail, lancée par bin/console ou par un script.

#[AsCommand(name: 'app:inventaire', description: 'Affiche l\'inventaire de la carte.')]
final class InventaireCommand
{
    public function __construct(private readonly CategorieRepository $categories)
    {
    }

    public function __invoke(SymfonyStyle $io, #[Option('Ne montrer qu\'une catégorie')] ?string $categorie = null): int
    {
        $io->title('Inventaire de la carte');
        // …
        if ([] === $categories) {
            $io->error(sprintf('La catégorie « %s » n\'existe pas.', $categorie));

            return Command::FAILURE;
        }
        // …
        return Command::SUCCESS;
    }
}

Comme tout service, la commande reçoit ses dépendances par le constructeur ; ses arguments et options se déclarent directement dans __invoke(), avec #[Argument] et #[Option]. SymfonyStyle donne une sortie cohérente : title(), table(), success(), error(). Le code de sortie, Command::SUCCESS, FAILURE ou INVALID, est tout ce que retiennent un script, une tâche planifiée ou la CI. Le piège : sans personne pour répondre, avec --no-interaction, $io->confirm() prend sa valeur par défaut. Une confirmation qui vaut false par défaut fait qu'un script nocturne n'enregistre plus rien, sans la moindre erreur.

Les exercices font lancer la commande qui charge la carte en base, écrire app:inventaire, un tableau filtrable par catégorie qui échoue sur une catégorie inconnue, corriger des commandes qui trompent les scripts par leur code de sortie ou leur confirmation, puis écrire app:soirees:rappeler, qui envoie la veille au soir un rappel aux inscrits des soirées du lendemain, sans jamais doubler un envoi, avec une option --dry-run.

4 exercices font travailler cette notion, en écrivant du code dans le navigateur.

Dans les parcours

Notions voisines

Codes de sortieInjection de dépendances#[Option]CommandTesterDébogageTraitement par lotsMailerMigrations