【Laravel】artisanコマンドを作ってみよう!

どーも!

たかぽんです!

今回はLaravelでよく使うartisanコマンド...

それを自作をしていこうと思います!

artisanコマンドを作ってみよう!

さて、それではartisanコマンドを自作していくわけなんですが、まずはartisanコマンドについて簡単に...

このartisanコマンドとは、Laravelというフレームワークを使う上で、そのフレームワークに沿ったマイグレーションファイルやモデルファイルの作成、また、フレームワーク側からそのコマンド名でなんらかの処理をしたい場合などにとても便利なCLIコマンドになっています!

CLIコマンドなので、コンソール上で叩くことで、コントローラーやモデルファイルのテンプレートの作成等...

様々なことができます。

公式リファレンスはこちらで解説されています。

上記にもありますが...

一部の例をあげますね。

// 現在登録されているartisanコマンドのリストを確認
php artisan list

// 現在登録されているrouteの確認
php artisan route:list

// Flightと言う名前のモデルのテンプレートファイルを適切な場所に作成
php artisan make:model Flight

などなど...

実はこのコマンド、デフォルトでたくさん用意されているので、基本はそれを使う形なんですが、自作もできるんですね。

将来的には...

php artisan (作ったコマンド名)

と言う形で実行できるようになるんですね!

なんとなくイメージできたでしょうか・・・?

それでは作っていきましょう!

まず最初にコマンド用のファイルを作ります。

他にコマンドのファイルが存在するならそれを複製して書き換える形でもいいんですが、せっかく最初なので先ほどのartisanコマンドを使ってやってみましょう!

では、コンソールにうつってLaravelで自身のプロジェクトフォルダまでcdで移動してください。

僕の場合はlaravelのインストール次に"MyProject"と名前をつけたので、以下のパスでした(インストール時おん場所によって変わります)。

(base) Takapon:MyProject taka$ pwd
/Users/taka/MyProject

移ったら、コマンド用のファイルを作成していきます。

せっかくなのでartisanコマンドのリストからartisanコマンド用のファイルを作ってくれるコマンドを探してみましょう!

以下のコマンドをコンソールで打ってください。

php artisan list

出力は以下のようになるはずです。

(base) Takapon:MyProject taka$ php artisan list
Laravel Framework 7.13.0

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
...
...
...
 make
  make:cast            Create a new custom Eloquent cast class
  make:channel         Create a new channel class
  make:command         Create a new Artisan command
  make:component       Create a new view component class
  make:controller      Create a new controller class
...
...
...

とても長いので一部のみ抜粋しますが、上記のような出力が出たかと思います。

これがphp artisanコマンドのリストです。

見方をお伝えすると...

上記の画像のように色付きで出てくると思うので、黄色い文字の部分は大まかな種別、そして緑の部分はさらに細かい実際のコマンド名を表しています。

dbの操作に関するコマンドはコマンド名の前半に"db"をつけるようにして、コロン(:)の後ろに詳細を書く...等

(ちなみに、db:seedは設定したテスト用の仮データをDBへ登録することができます。)

makeは文字からもわかりますが、何かしらを作るコマンド群と言うわけですね。

(筆者の環境だとver7.13なので、8.x以降をお使いの場合は少し違う部分もあるかもしれません)

なので、今回欲しいコマンドを作成するコマンドもありそうですね...!

よくみてみると...?

"make:command"と言うものがありますね!

では、そのコマンドの使い方をみてみましょう!

以下のコマンドを入力すると...?

hp artisan help make:command

以下のようにそのコマンドの使い方が出てきます。

(base) Takapon:MyProject taka$ php artisan help make:command
Description:
  Create a new Artisan command

Usage:
  make:command [options] [--] <name>

Arguments:
  name                     The name of the command

Options:
      --command[=COMMAND]  The terminal command that should be assigned [default: "command:name"]
  -h, --help               Display this help message
  -q, --quiet              Do not output any message
  -V, --version            Display this application version
      --ansi               Force ANSI output
      --no-ansi            Disable ANSI output
  -n, --no-interaction     Do not ask any interactive question
      --env[=ENV]          The environment the command should run under
  -v|vv|vvv, --verbose     Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
// このコマンドのヘルプをみれますよ〜
php artisan make:command -h

// このコマンドの出力メッセージを消せますよ〜
php artisan make:command -q

// このコマンドのバージョンを動かすlaravelのバージョンを確認できますよ〜
php artisan make:command -V

// などなど...

基本はLinuxのコマンドのヘルプと一緒ですが、いろんなオプションを使うことでさらに細かいことができたりもします。(今回は使わないのでそのままいきます。)

Usageの以下の行から...

make:command [options] [--] <name>

// 実際に打つコマンド
php artisan make:command "作りたいファイル名"

上記の実際に打つコマンドのようにすれば良さそうということがわかります。

(artisanのhelpには乗っていませんが、php artisanと言うのをつけないとnotfoundになるので気をつけてくださいね。)

では、適当に名前をつけて"HelloWorldCommand"と名前をつけてみようと思います。

(base) Takapon:MyProject taka$ php artisan make:command HelloWorldCommand
Console command created successfully.

成功したっぽいですね。

できたら、エディタ等で先ほどの"HelloWorldCommand"のファイルを探すか...

以下のパスのCommands以下に作成されていると思うので、ファイルを探してみてください。

以下のコメントアウトしている箇所を書き換えていますので、そこを書き換えたら保存しましょう!

(一応、"<?php"行以下をコピペすればそのままでも動くはずです。)

// {laravelのプロジェクト名}/app/Console/Commands/HelloWorldCommand.php

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class HelloWorldCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    // protected $signature = 'command:name'; <-ここを下の行で書き換え
    protected $signature = 'display:hello-world';

    /**
     * The console command description.
     *
     * @var string
     */
    // protected $description = 'Command description'; <-ここを下の行で書き換え
    protected $description = '"HelloWorld"を表示します。';
    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // ここを追記
        dump('HelloWorld!!!');
    }
}

上記を保存できたら実はもうコマンドの登録が住んでいます...!

これだけで登録は完了しているので、あとはコマンドを実行してみましょう!

コンソールに戻って、リストを確認してみます。

(base) Takapon:MyProject taka$ php artisan list
...
...
 display
  display:hello-world  "HelloWorld"を表示します。
...
...

すると、上記のように先ほど追加したコマンド"display:hello-world"がちゃんと表示されているはずです...!

先ほど書き換えたのはこのリスト表示時のコマンド名とその説明だったんですね!

では...実際にコマンドを動かしてみます。

(base) Takapon:MyProject taka$ php artisan display:hello-world
"HelloWorld!!!"

ちゃんとHelloWorldと表示されました!

今回はただ出力を確認するだけ...だったので、dumpでの表示のみでしたが、ここで例えばDBの操作等もできますし、特定のデータを抽出...なんてこともできそうですね。

また、定期的に実行したいバッチ処理などもLaravelでは設定できるんですが、その際に使う処理としてコマンドを指定したりもできます。

また、少し詳しい活用例をお話しすると...AWSのSQSにエンキューされた際にのみ処理をしたい場合...

このcommandとしてキューの監視、メッセージに対する処理も合わせて書いておき、無限ループで常にキューの中身をみて、メッセージがきた際にはそのメッセージに応じた処理をする...といったこともできます。

(その場合、このコマンドを実行するための専用サーバーが別で必要になりますが...。)

まとめ

一通りコマンドの作り方、わかったでしょうか...!

ファイルを一つ作るだけ...なんですね!

ただし、ファイルのパス等はしっかり守らないと、ファイルないぞ〜?

ってなるので、エラーになった場合はファイルのパスがちゃんとCommandの直下にあるか調べてみるといいかもしれません!

実際はファイルを一つ作るだけなので、最初にしたコマンド用ファイルを作るコマンドを打たずとも、既存のコマンド用のファイルを同じフォルダ下に別名で保存後、クラス名とコマンド名や説明、処理を書き換えればこちらも同様に動きます。

自作コマンドも案外簡単に作れるんです...!

おそらく僕でも知らないようなCommandの活用方法もきっとあると思うので、是非そちらについても調べてみてください!

そして、是非今の段階で公式のリファレンスをみてみて、あぁ、そういうことなのかぁ!

って理解を深めておくといいと思います!

それでわ!

おすすめの記事