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.
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 :
php artisan make:command viderBDCommand
Ceci crée le fichier app\Console\Commands\viderBDCommand.php dont voici le code :
Ex :
<?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()
{
//
}
}
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 :
On pourra faire suivre par :
Dans notre exemple, cette étape prendra la forme suivante :
Ex :
protected $signature = 'vider:bd {--donnees : Supprimer seulement les données}';
La description qui accompagne la commande sera :
Ex :
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 :
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 :
php artisan help vider:bd
Le code de la commande artisan sera placé dans la méthode handle().
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 :
/**
* 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;
...
}
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 :
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);
}
}
Il faut ensuite écrire la logique de la commande.
Voici le code complet du fichier viderDBCommand.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.' );
}
}
}
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 :
php artisan vider:bd
ou :
php artisan vider:bd --donnees
ou :
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.
« Artisan Console ». Laravel. https://laravel.com/docs/master/artisan
▼Publicité