環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

【初心者向け】Laravelでコンソールコマンドを使う

Laravelには、Artisanというコマンドラインインターフェースがあり、開発の最中にもとても重宝します。controllerやmodelやexceptionなどのクラスを生成するのにmakeコマンドを使ったり、DB構築をするためにmigrateコマンドを使ったり、キュー操作をするためにqueueコマンドを使ったり、様々。

そんなArtisanコンソールですが、自由にカスタムコマンドを作成することも出来る。今回はカスタムコマンドを生成してみる。

今回の環境

  • Laravel 6.20.0
  • PHP 7.4.13

コマンドの意義は?

業務などで、アプリケーションの開発や運用に携わったことがない方は、コマンドって何に使うんだと。どのくらい意味があるのかと。そう思う方もいるだろう。実際にコマンドでしか作業できないということは、ほぼなく、ほとんどの事はGUIで操作するツールを作る事が可能だろう。語弊がないように言っておくが、全てをコマンドにするのが良いなどと言っているわけではなく、コマンドにも良さがあることを述べたいだけである。あしからず!

ここで仮に「ログを調べて直近1時間に出力されたエラーを抽出して、件数を調べる」という作業があったと仮定してみる。

人に依存する作業を減らせる

またしても仮に、GUI上で、直近1時間のログが見れるツールがあったとして、人の作業の場合は「違う画面を見ていた」とか「違う絞り込み条件で調べていた」とか「エラー件数が9件なのに8件と見間違えていた」とか、「1件ずつチェックしていたので見逃した」とか、そういうことが起こる余地がある。その余地を限りなく減らすようにツールを開発することも可能だが、ガチガチなアプリを作っても汎用的に使用できない場面も多い。

一方で、あるコマンドを打って出力された内容を見るというのは、それに比べて間違いが介入する余地が少なく、手順にも書き起こしやすいので、誰が行っても一意な作業にすることが容易。

自動化しやすい

この作業を1時間に1回行って欲しいと言われた場合には、自動化を考えるだろう。まさかとは思うが、1時間に1回手作業で確認するなどという運用に落としてしまう事はないように。(そんなとんでもない悪魔のアプリ確認作業がある企業も存在しますが)

自動化する場合、前者だとGUI操作を自動化しなければならないし、仮にやったとしてもそれを閲覧するのは誰なんだという問題も残り、とても厳しい。一方でコマンド前提であれば、crontabに仕込んで1時間に1回実行する事は容易だし、コマンド自体の中にメール送信まで含めて記述しておけば、1時間に1回という作業をユーザーが意識する必要もない。あとで見ればいい。

以上の通り、コマンドベースで実行出来ると助かる事も多い。当然視覚的に見れると便利なものもあるので、使い分ければ良い。

コマンドを作成する

さて、なんとなくコマンドの意義が改めて分かったところで、作ってみる。

作成

コマンドを新規に作成するには、プロジェクトフォルダ直下にて、make:command コマンドを実行する。このコマンドを実行すると、app/Console/Commands配下にクラスが作成される。

php artisan make:command HelloWorld

すると、app/Console/Commands/HelloWorld.phpが自動生成される。もちろん「HelloWorld」の部分は目的に合わせたクラス名にする。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class HelloWorld extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}

コマンドの設定

生成されたクラスを設定していく。まずは、どういうコマンドで実行させるか。

例えばArtisanコンソールにて、controllerを作成するコマンドはこんな感じ。

【Artisanコマンド例】※実行する必要はありません
php artisan make:controller ItemsController

この「make:controller」の部分を自由に設定できる。今回は、HelloWorldということで、disp:helloというコマンドにしてみる。先程生成したHelloWorld.phpを以下のように修正してみる。

protected $signature = 'disp:hello';

次に、コマンドの説明文を書いておく。これは動作には必須ではないが、記述しておくとあとから見た時に親切なので、設定しておく。

protected $description = 'HelloWorldを実行するコマンド';

ここまで実施できたら、一度コマンドリストを確認してみる。Artisanコンソールは、listコマンドで使用可能なコマンド一覧を閲覧可能である。先程設定したコマンドが表示されているはずだ。確認できただろうか。

php artisan list

コマンドを実行する場合は、他のコマンドと同様に以下のようにする。

php artisan disp:hello

まだ処理を記述していないので、何も起こらないが、実行が可能な環境はこれで整った。簡単である。

ちょっとした処理を書いてみる

今回は単純にHelloWorldと出力する処理を書いてみる。処理は記述する場所はhandleメソッドの中だ。

    public function handle()
    {
        echo "Hello World\n";
    }

再度実行してみると、表示されることが分かるだろう。

php artisan disp:hello

【結果】
Hello World

ここではHelloWorldと出力するにとどめたが、DB操作をしても良いし、メール送信をしても良いし、PHPで書ける限りの事は実行できるので、お好みで実装すればOK。

さいごに

簡単に独自のコマンドが実装できた。作成作業はコマンド1個と2〜3行程度の修正のみ。いろいろなことに使えるので、覚えて損はなさそうだ。

それでは。