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 un lien vers une Demo CodeSandbox ou 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.