Créer des commandes cli pour Symfony

Framework Symfony

Si il y a bien une chose que j’ai appris récemment sur Symfony, c’est créer des commandes cli.
J’étais curieux de connaître la façon de faire.

J’ai commencé par lire la documentation du Framework, à l’adresse suivante : https://symfony.com/doc/current/console.html.
Cette documentation est assez compréhensible, même si elle est en anglais. Voici ce que j’en retire :

  • Les fichiers commandes doivent obligatoirement être dans le dossier src/Command.
  • La classe de votre commande doit forcément étendre la classe Command
  • Une variable $defaultName doit contenir le nom de la commande
  • Une classe commande contient 2 fonctions
    • execute() : pour créer une commande
    • configure(): Pour configurer une commande

Voici un exemple de commande :

<?php

namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class TimeCommand extends Command
{
    protected static $defaultName = 'app:time';

    protected function configure(): void
    {
        $this->setName('time')
            ->setDescription('Shows current date and time')
            ->setHelp('This command prints the current date and time');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $now = date('d/m/Y à H:i:s');
        $message = sprintf("Cette commande a été lancé le : %s", $now);

        $output->writeln($message);

        return Command::SUCCESS;
    }
}

Pour mon cas, comme j’utilise Symfony 5, il faut que j’enregistre cette commande dans le fichier services.yaml

services:
    App\Command\TimeCommand:
        tags:
            - { name: 'console.command', command: 'time' }

Au lancement de la commande, voici ce que cela donne :

Commandes sous Symfony.
Commandes sous Symfony.

Liens

Documentation Symfony : https://symfony.com/
Article sur Symfony : https://guillaume-richard.fr/category/developpement/symfony/