Categories:

Créer une commande avec Symfony

Version de Symfony au moment de l’article : 5.1.8

Nous allons voir comment créer sa propre commande avec Symfony. Cette fonctionnalité est disponible depuis la version 1.1 mais a beaucoup évolué depuis.

Pourquoi créer sa propre commande ?

L’utilisation des commandes est très variée, par le simple fait qu’elles vous permettent de communiquer avec vos entités et vos services ; l’univers des possibles est immense. La commande est souvent destinée à la manipulation exclusive de l’administrateur. Elle permet d’éviter la création d’une interface graphique dans le cas où ce n’est pas nécessaire.

Quelques exemples :

  • Importer des fichiers Csv en base de données
  • Créer une entrée en base, un utilisateur par exemple
  • Script de mise à jour

On commence ?

Symfony nous facilite le démarrage. Pour commencer, mettez en place le squelette de votre commande avec la ligne suivante :

php bin/console make:command

Dans cet article, la commande a pour objectif l’import d’un fichier Csv je l’ai donc appelé app:import-command, soyez plus original que moi et précisez votre entité à importer.

Symfony a créé un fichier dans le répertoire src/Command/nomDeVotreCommande.php

La variable $defaultname correspond à la commande à écrire pour exécuter votre joli code !

Personnalisation de notre commande

A part afficher un message à l’utilisateur, elle ne fait pour l’instant pas grand-chose. D’un point de vue logique Symfony et organisation des fichiers, votre fichier Command doit être interprété comme le point d’entrée de la commande. Il est le Controller de la commande. Il ne faut donc pas hésiter à positionner les fonctions de traitements dans les fichiers adéquats : Service, Repository etc…

Pour un souci de présentation je vais me contenter ici de mettre tout dans ce même fichier ImportCommand.php

Notre mission est d’importer nos utilisateurs qui sont dans un fichier Csv que voici :

PrénomNomEmail
TomEigeritomeigeri@exemple.com
AlineHéaAlinehea@exemple.com
JonathanQueutoisjonathanquetois@exemple.com

La fonction execute, vous l’avez déjà deviné, est le corps de notre commande. Voici le code pour un import simple de données en base.

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);

        if (($handle = fopen($this->csv, "r")) !== false) {
            while (($line = fgetcsv($handle, 1000, ",")) !== false) {
                $user = (new User())
                    ->setFirstname($line[0])
                    ->setLastname($line[1])
                    ->setEmail($line[2]);
                   $user->setPassword($this->encoder->encodePassword($user, "motDePasse"));
                $this->manager->persist($user);
            }
            fclose($handle);
        }
        $this->manager->flush();
        $io->success('Votre commande est un franc succès');
        return Command::SUCCESS;
    }

Ici nous avons utilisé deux services externes à la commande, l’encodeur de mot de passe et l’Entity Manager, il suffit de les déclarer dans notre classe et de les définir dans le constructeur.

On modifie la description dans la fonction configure, et votre première commande Symfony est créée et fonctionnelle.

Pour finir…

Vous n’avez plus qu’à vous laisser emporter par la multitude d’options que vous offre cet outil. La documentation officielle (https://symfony.com/doc/current/console.html) vous explique aussi étape par étape la création, d’une commande mais dans la langue de Shakespeare.

Je vous met sur le lien suivant le code de mon fichier ImportCommand complet : https://baptisteprieto.fr/exemple-commande-import-symfony/

Prenez soin de vous.

Une question ? Une remarque ? Faites le moi savoir.

contact@baptisteprieto.fr | https://www.linkedin.com/in/baptiste-prieto/