Symfony Console Command

Des commandes avec Symfony

Juin 03
LabInc

Si vous avez installé Symfony, et après quelques manipulations vous avez certainement du utiliser les commandes de console comme pour purger le cache par exemple :

php bin/console cache:clear

Symfony avec le bundle Console Command permet de faire nos propres commandes assez facilement et rapidement.

Prenons le mini projet Symfony 5 réalisé lors des vidéos "Découvertes de Symfony".

Imaginons que vous souhaitez modifier le status d'un article de brouillon à publié. Mais c'est une tache régulière et vous n'avez pas envie de faire cela systématiquement en base, ou d'accéder à l'interface et de le faire via le back-office. Ca serait pas plus cool avec une commande :

php bin/console article:publish

Création de notre première commande

Nous devons tout d'abord créer une classe qui étend de la class Command de Symfony :

<?php
//src/Command/PublishArticleCommand.php
namespace App\Command;

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

class PublishArticleCommand extends Command
{
    // le nom de notre commande
    protected static $defaultName = 'article:publish';

    protected function configure()
    {
        $this->setDescription('Cette commande publie un article')->setHelp(
            'Cette commande permet de publier un article...'
        );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);
        $io->title('Publication d\'un article');
        return 0;
        //return Command::SUCCESS; à partir de Symfony 5.1
    }
}

Super Simple non ? et ca marche déjà :

php bin/console article:publish

Publication d'un article
========================

Ok ! Mais on veut que cette commande permettent de publier un article. Ajoutons un paramètre à cette commande. L'id de l'article !

Et avec un paramètre ?

protected function configure()
    {
        $this->setDescription('Cette commande publie un article')
            ->setHelp('Cette commande permet de publier un article...')
            ->addArgument('id', InputArgument::REQUIRED, 'Id de l\'article');
    }

Un petit test en ne spécifiant pas d'argument :

php bin/console article:publish

  Not enough arguments (missing: "id").

article:publish [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command> <id>

On récupère l'argument :

Modifions à présent notre fonction execute de cette manière :

protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);
        $article_id = $input->getArgument('id');
        $io->title('Publication de l\'article article' . $article_id);

        if (is_numeric($article_id)) {
            $helper = $this->getHelper('question');
            $question = new ConfirmationQuestion('On continue (y/n) ?', false);
            if (!$helper->ask($input, $output, $question)) {
                //action annulée on ne fait donc rien !
                return 0;
            }
            $io->text("Traitement de l'Article n° $article_id");
            // $monrepo->publishArticle($article_id);
        } else {
            $io->error("ID est n'est pas un nombre !");
        }
        return 0;
    }

On ajoute un petit test pour vérifier que la valeur est bien numérique (ligne 6) ; sinon on sort en erreur (ligne 17). Un peu overkill pour notre exemple mais on peut meme ajouter une demande de confirmation (ligne 9)

Ne reste plus qu'à mettre en place notre requete SQL qui va bien pour publier notre article (ligne 15)..

C'est super simple n'hésitez pas à explorer toutes les possibilités sur la documentation officiel de Symfony

Blog Comments powered by Disqus.

Post précédent