Blog / Créer son propre script Artisan

Image used for article Créer son propre script Artisan

Créer son propre script Artisan




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 CapsulesX ou Bluesky.



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.

v1.4.0

Icône XIcône Github