Formation PUB030 : Laravel, 2019 Les outils de Laravel

2.5 Créer nos propres commandes artisan


Pour faciliter votre travail, vous pouvez créer vos propres commandes artisan qui se chargeront d'effectuer des tâches répétitives.

Pour vous montrer la technique, je vais créer une commande artisan qui permet de vider complètement la base de données à condition que l'application soit en mode développement. Ceci peut être pratique dans le cas où vous avez fait des erreurs dans vos fichiers de migration et que le php artisan migrate:refresh ne fonctionne plus.

Générer le squelette de la classe

Le code de la commande artisan sera contenu dans une classe.

Pour générer le squelette de cette classe, que j'ai choisi d'appeler viderBDCommand :

Console Vagrant SSH

php artisan make:command viderBDCommand

Ceci crée le fichier app\Console\Commands\viderBDCommand.php dont voici le code :

Ex :

fichier app\Console\Commands\viderBDCommand.php

<?php

 

namespace App\Console\Commands;

 

use Illuminate\Console\Command;

 

class viderBDCommand extends Command

{

    /**

    * The name and signature of the console command.

    *

    * @var string

    */

    protected $signature = 'command:name';

 

    /**

    * The console command description.

    *

    * @var string

    */

    protected $description = 'Command description';

 

    /**

    * Create a new command instance.

    *

    * @return void

    */

    public function __construct()

    {

      parent::__construct();

    }

 

    /**

    * Execute the console command.

    *

    * @return mixed

    */

    public function handle()

    {

      //

    }

}

Signature de la commande

Le champ $signature permet d'indiquer comment la commande devra être appelée et ce qu'elle attendra comme arguments et options.

Je n'ai pas trouvé de normes de signature adoptées par l'ensemble de la communauté. Dans un tel cas, il est intéressant de voir ce que le plus grand nombre a choisi. Je vous suggère donc d'utiliser :

  • un verbe (ex : vider)
  • suivi de deux points (:)
  • puis du sujet (ex : bd)

On pourra faire suivre par :

  • un argument obligatoire : {nomargument : Description}
  • un argument optionnel : {nomargument? : Description}
  • un argument avec valeur par défaut : {argument=valeurpardefaut : Description}
  • une option : {--nomoption : Description}
  • une option avec un raccourci : {--N|nomoption : Description} (note : pour utiliser le raccourci, on fera précéder le raccourci d'un seul trait d'union)
  • une option qui attend une valeur de la part de l'usager : {--nomoption= : Description}

Dans notre exemple, cette étape prendra la forme suivante :

Ex :

fichier app\Console\Commands\viderBDCommand.php

protected $signature = 'vider:bd {--donnees : Supprimer seulement les données}';

La description qui accompagne la commande sera :

Ex :

fichier app\Console\Commands\viderBDCommand.php

protected $description = 'Vide la base de données de toutes ses tables';

Si vous affichez la liste des commandes artisan, vous verrez que votre commande est déjà connue :

Console Vagrant SSH

php artisan list

php artisan list

Et si on demande l'aide sur notre commande, le texte précisé dans la description et pour chacun des arguments et options apparaît.

Ex :

Console Vagrant SSH

php artisan help vider:bd

aide sur la nouvelle commande

Code de la commande

Le code de la commande artisan sera placé dans la méthode handle().

Retrouver les arguments et options

Tout d'abord, cette méthode doit pouvoir retrouver les arguments et les options fournies par l'usager.

Les arguments utiliseront la méthode argument() et les options, option().

Ex :

fichier app\Console\Commands\viderBDCommand.php

/**

* Execute the console command.

*

* @return mixed

*/

public function handle()

{

    // vérifie si l'option a été utilisée

    $donneesSeulement = $this->option('donnees') == null ? false : true;

 

   ...    

      

}

Demander confirmation

Lorsque des suppressions sont impliquées, il est important de demander une confirmation avant de procéder. La méthode confirm() vous sera utile pour cette tâche.

Ex :

fichier app\Console\Commands\viderBDCommand.php

if ($donneesSeulement) {

    if (!$this->confirm('Désirez-vous vraiment VIDER toutes les tables de la base de données ?')) {

        exit( 'Commande annulée' . PHP_EOL);

    }

}

else {

    if ( ! $this->confirm( 'Désirez-vous vraiment SUPPRIMER toutes les tables de la base de données ?' ) ) {

        exit( 'Commande annulée' . PHP_EOL);

    }

}

Logique de la commande

Il faut ensuite écrire la logique de la commande.

Voici le code complet du fichier viderDBCommand.php.

fichier app\Console\Commands\viderBDCommand.php

<?php

 

namespace App\Console\Commands;

 

use Illuminate\Console\Command;

use DB;

 

class viderBDCommand extends Command

{

    /**

    * The name and signature of the console command.

    *

    * @var string

    */

    protected $signature = 'vider:bd {--D|donnees : Supprimer seulement les données}';

 

    /**

    * The console command description.

    *

    * @var string

    */

    protected $description = 'Vide la base de données de toutes ses tables';

 

    /**

    * Create a new command instance.

    *

    * @return void

    */

    public function __construct()

    {

      parent::__construct();

    }

 

    /**

    * Execute the console command.

    *

    * @return void

    */

    public function handle()

    {

        // vérifier si on est en mode débogage

        $environnement = config('app.env');

 

        if ($environnement != 'local') {

        exit('Cette commande ne peut être utilisée qu\'en mode développement (APP_ENV=local).' . PHP_EOL);

        }

 

        // vérifier si l'option a été utilisée

        $donneesSeulement = $this->option('donnees') == null ? false : true;

 

        // demander confirmation

        if ($donneesSeulement) {

            if (!$this->confirm('Désirez-vous vraiment VIDER toutes les tables de la base de données ?')) {

                exit( 'Commande annulée' . PHP_EOL);

            }

        }

        else {

            if ( ! $this->confirm( 'Désirez-vous vraiment SUPPRIMER toutes les tables de la base de données ?' ) ) {

                exit( 'Commande annulée' . PHP_EOL);

            }

        }

 

        // ignorer les contraintes d'intégrité référentielle

        DB::statement('SET FOREIGN_KEY_CHECKS=0');

 

        // retrouver la liste des tables

        $tables = DB::select('SHOW TABLES');

 

        if (!$donneesSeulement) {

            // détruire chacune des tables

            foreach ($tables as $tableStdClass) {

                foreach ($tableStdClass as $key => $table) {

                    DB::statement("DROP TABLE $table");

                }

            }

        }

        else {

            // vider chacune des tables

            foreach ($tables as $tableStdClass) {

                foreach ($tableStdClass as $key => $table) {

                    DB::table($table)->delete();

                }

            }

        }

 

        // réactiver les contraintes

        DB::statement('SET FOREIGN_KEY_CHECKS=1');

 

        // message de confirmation

        if ($donneesSeulement) {

            $this->info( 'Toutes les DONNÉES de la base de données ont été supprimées.' );

        }

        else {

            $this->info( 'Toutes les TABLES de la base de données ont été supprimées.' );

        }

    }

}

Utiliser notre commande artisan

Dans la console Vagrant SSH, alors que vous êtes dans le dossier de l'application, lancez la commande artisan selon la signature identifiée plus tôt :

Console Vagrant SSH

php artisan vider:bd

ou :

Console Vagrant SSH

php artisan vider:bd --donnees

ou :

Console Vagrant SSH

php artisan vider:bd -D

Notez que le message de confirmation exige que l'usager réponde par Y, YES, YS ou YE (en majuscules, minuscules ou mélangé). Toute autre réponse sera considéré comme un non.

Pour plus d'information

« Artisan Console ». Laravel. https://laravel.com/docs/master/artisan

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre