Laravel artisanコマンドは例えば migrate コマンドあたりが有名だと思います。
$ artisan migrate
実はこのコマンドと同様に使えるコマンドを独自で実装することができます。
その実装方法と、特に既存のコマンドを組み合わせた独自コマンドを作る方法について説明します。
コマンドの作り方
以下のように artisan make コマンドを用いて作成できます。
$ artisan make:command NewCommand
これでひな形ができるので、必要な箇所を書き換えれば終わりです。
既存コマンドの呼び出し方
私が作ったコマンドの例ですと、migrate した後に即座に cache clear をするものです。
このコマンドの目的はmigrate してDBの状態が変わった後に、それがキャッシュしたままだとエラーが起こるような設計にしている場合、即座にcache削除をしたいのですが、
artisan migrate
コマンドを打った直後に artisan cache:clear
を打つという人力オペレーションだと辛いので同時に実行してくれるラッパーコマンドが欲しかったです。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MigrateAndClearCache extends Command
{
// ここがサブコマンドの名前になり、$ artisan migrate-and-cache-clear とすれば実行できます。
protected $signature = 'migrate-and-cache-clear';
/**
* The console command description.
*
* @var string
*/
protected $description = 'migrate and cache:clear db_cache_memcached';
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
$this->call('migrate');
// cache clear をするキャッシュを引数で指定しています。これは $ artisan cache:clear db_cache_memcached とやったのと同じです
$this->call('cache:clear', ['db_cache_memcached']);
}
}
ちなみにキャッシュサーバに名前をつけたり分離する方法についてはこちらの記事で紹介しています。https://qiita.com/yamotuki/items/b90af273e2e8e09aa3d2
コマンドリストでもみれます
root@5e3732562350:/var/www# artisan list | grep migrate
migrate Run the database migrations
migrate-and-cache-clear migrate and cache:clear db_cache_memcached
以下略
補足
他のコマンドの呼び出し方法については MigrationCommand 内の handle() の実装を参考にしました。
vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php
if ($this->option('seed') && ! $this->option('pretend')) {
$this->call('db:seed', ['--force' => true]);
}