Blog / Créer son propre script Artisan
2 min - 03 Aug 2023
TL;DR : Durant le développement du projet Flintable, j'ai voulu customiser le script Artisan. Voici comment utiliser la ligne de commande php artisan
sans utiliser le mot artisan
.
Vous trouverez le code source via ce Github Repository. Découvrez en plus sur Capsules ou X.
Tous les artisans Laravel reconnaîtront la commande php artisan inspire
. Mais ce que tout le monde ne sait pas forcément, c’est qu’il est possible de personnaliser cette commande.
L’inavouable secret : modifier le fichier artisan à la racine du projet.
mv ./artisan ./is-dead
Incroyable ! La commande php is-dead inspire
fonctionnera dorénavant tout autant que la commande initiale php artisan inspire
.
Nous pourrions arrêter ce drame ici, nous direz-vous, mais nous irons plus loin.
Certains le savent déjà, mais il est aussi possible d’appeler la commande artisan via la Facade\Artisan
comme ci-dessous dans le fichier routes/console.php
.
Artisan::command( 'inspire', function () {
$this->comment( Inspiring::quote() );
})->purpose( 'Display an inspiring quote' );
Il suffirait alors de copier le fichier /vendor/laravel/framework/Illuminate/Support/Facades/Artisan.php
.
<?php
namespace Illuminate\Support\Facades;
use Illuminate\Contracts\Console\Kernel as ConsoleKernelContract;
class Artisan extends Facade
{
protected static function getFacadeAccessor()
{
return ConsoleKernelContract::class;
}
}
Et modifier les informations qui nous concernent dans un nouveau fichier [ et dossier ] dans app/Facades/IsDead.php
.
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
use Illuminate\Contracts\Console\Kernel;
class IsDead extends Facade
{
protected static function getFacadeAccessor() : string
{
return Kernel::class;
}
}
Pour ensuite pouvoir l’utiliser dans son code, il faut injecter l’alias dans la liste des aliases
dans le fichier de configuration config/app.php
.
'aliases' => Facade::defaultAliases()->merge( [
'IsDead' => App\Facades\IsDead::class
] )->toArray(),
Modifions la méthode inspire
dans routes/console.php
pour pouvoir la lire dans tinker
.
use Illuminate\Foundation\Inspiring;
use App\\Facades\IsDead;
IsDead::command( 'inspire', function () {
echo Inspiring::quotes()->random();
})->purpose( 'Display an inspiring quote' );
Maintenant il n’y a plus qu’à l’utiliser dans php is-dead tinker
.
IsDead::call( 'inspire' );
Pour que les dépendances du projet puisse s'installer convenablement, il est nécessaire de remplacer les php artisan
en php is-dead
des scripts du fichier composer.json
.
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php is-dead package:discover --ansi"
],
"post-update-cmd": [
"@php is-dead vendor:publish --tag=laravel-assets --ansi --force"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php is-dead key:generate --ansi"
]
},
Ravi d’avoir pu aider.