【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のインストール次に"MyProject"と名前をつけたので、以下のパスでした(インストール時の場所によって変わります)。

該当のフォルダでlsをしてappやartisanがあれば、大丈夫です。

(base) Takapon:MyProject taka$ pwd
/Users/taka/MyProject
(base) Takapon:MyProject taka % ls
README.md	artisan		composer.json	config		lang		phpunit.xml	resources	storage		vendor
app		bootstrap	composer.lock	database	package.json	public		routes		tests		vite.config.js

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

せっかくなので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コマンドのリストです。

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

上記の画像のように黄色の部分、緑の部分とインデントが分かれて出てくる(色は筆者がiTermを使っているため、基本は色分けされていないと思います)ので、黄色い文字の部分はコマンドの大まかな種別、そして緑の部分はさらに細かい実際のコマンド名を表しています。

何かしら作るコマンドの種別はmakeで、何を作るか?をコロンの後に...といった具合ですね。

基本的にはこの命名規則に従う形が良いかと思います。

今回は、このmakeのなかから...

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

文字通り、コマンドを作成するためのコマンド...となっています。

ヘルプを確認しておきましょう。

php 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

Usageの以下の行から...

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

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

optionなしでよければ、上記のコマンドのようにすれば良さそうということがわかります。

(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"がちゃんと表示されているはずです...!

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

また、handleメソッドの処理が実際にこのコマンドを実行した場合に行われる処理となっています。

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

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

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

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

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

具体的には、営業が確認するための売り上げ内容をGoogleSpreadSheetで管理しており、DBにある売り上げテーブルの内容をcsvとして書き出して毎週更新したい...!といった場合...

売り上げテーブルの情報をcsvとして書き出す処理を"create:sales-csv"として作って、laravelのTaskSchedulingなどで毎週定時にそのコマンドを実行するようにしてあげれば、きっといい感じに動くでしょう。

このコマンド+TaskSchedulingを使用すると、また幅が広がるのかな?と思います!

まとめ

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

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

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

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

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

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

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

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

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

それでわ!

おすすめの記事