Laravelで自作コマンドを動かす

Laravel

Laravelで開発している過程で、web上の機能としては不要ですが、単発で関数を動かしたいケースがありました。
その結果、自作コマンドを作成しましたので、要点を記していきたいと思います。

※開発環境としては、Laravel8系になります。

まず、コマンドをつくる

aritisanコマンドで作成します

php artisan make:command SendEmails

app/Console/CommandsディレクトリにSendEmailsファイルが作成されます(commandディレクトリがなくても、makeコマンド叩くと作成してくれるそうです)

コードのポイント

コマンドを叩いてファイルを開くと(図の例だとSendEmailsになりますね)、以下の感じになります:

<?php

namespace App\Console\Commands;

use App\Models\User;
use App\Support\DripEmailer;
use Illuminate\Console\Command;

class SendEmails extends Command
{
    /**
     * コンソールコマンドの名前と使い方
     *
     * @var string
     */
    protected $signature = 'mail:send'; //①

    /**
     * コンソールコマンドの説明
     *
     * @var string
     */
    protected $description = 'Send a marketing email to a user';//②

    /**
     * 新しいCommandインスタンスの生成
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * consoleコマンドの実行
     *
     * @param  \App\Support\DripEmailer  $drip
     * @return mixed
     */
    public function handle(DripEmailer $drip) //③
    {
        $drip->send(User::find($this->argument('user'))); 
    }
}

ポイントはコメントアウトしたところの3つで、

①$signature変数のところにコマンド名を記載する
②$description変数のところにコマンドの説明を記載する
 ※ただしこの変数を使わずに書けれるので、マストというわけではない?
  自分の手元ではコメントと同じ機能しかなしてません・・
③handle関数のところに、実際に行いたい処理を記載していく
 また、DripEmailer $dripのところのように依存性注入(DI)も使えます
 (これがLaravelっぽいですね!)

という感じになります。

その他、大量のデータを入れるなど、少し時間かかる場合は、ターミナル上でステータスバーを出すこともできます

$users = App\Models\User::all();

$bar = $this->output->createProgressBar(count($users));

$bar->start();

foreach ($users as $user) {
    $this->performTask($user);

    $bar->advance();
}

$bar->finish();

こんな感じの表示がされますね!(こういうのあると親切ですね!)

他にも
・成功しました!などの出力の書き込み
・ヘルプ内容書く(ここまでやる人いるのかな…?)
などもできるそうです。ここはまだ勉強中。

コマンドを実行する

$signature変数の内容がコマンド名になります。
つまり、上の例でいうと

php artisan mail:send

となります。

まとめ

真新しいことではなく、関数などを書ければ抵抗なくすぐに使えるなと思いました。
(実装したことないですが)バッチ処理もこれの延長なのだろうと思います。

リーダブルを参考にして記事を書きました

Artisanコンソール 8.x Laravel

コメント

タイトルとURLをコピーしました