1
3

More than 3 years have passed since last update.

Laravel6で新規追加されたJob Middlewareを使ってみる

Last updated at Posted at 2019-09-08

概要

つい最近Laravel6がリリースされました。
その中でも、Laravel6で新規追加されたJob Middlewareについて、かなり単純ですがサンプルコードを書きました。
1から作成している記事がまだ見当たらなかったので、もしさっと1から試してみたい!という方はぜひ読んでみてください。

ソースコード

試してみたい方はGitHubにあげているのでこちらからどうぞ。
solt9029/LaravelJobMiddlewareTutorial

そもそもJob/Queueとは?

知っている方は読み飛ばしてください。
例えばユーザがアカウント登録を行ったときに、そのアカウント登録内容をメール送信したいような場合があります。
そういったときに、メール送信処理の間ユーザを待たせるのはよろしくありません。
Job/Queueを使えば、そういった処理を非同期に行うことができ、ユーザを待たせずにメール送信を行ったりすることができます。

実際にやってみる

プロジェクト作成

Laravel6はPHP7.2以上を求めるので注意してください。
まずはLaravelの新規プロジェクトを作ります。

composer global require laravel/installer # laravelコマンドが入ってない場合
laravel new LaravelJobMiddlewareTutorial

環境変数設定

次に、環境変数を編集していきます。
今回は簡単にするためにSQLiteを使用しようと思うので、MySQLまわりの設定を削除し、以下の設定を加えます。
また、Queueで今回はデータベースを使用するために、syncではなくdatabaseに変更します。

.env
DB_CONNECTION=sqlite
QUEUE_CONNECTION=database

データベース設定

touch database/database.sqlite
php artisan queue:table # Queue用のテーブルを作るマイグレーションファイル作成
php artisan migrate

Job作成

php artisan make:job LogJob

作成したJobを編集していきます。
今回は単純に、ログが表示されるだけのJobを用意してみました。

app/Jobs/LogJob.php
use Illuminate\Support\Facades\Log;

class LogJob implements ShouldQueue
{
    //

    public function handle()
    {
        Log::info('LogJob handled');
    }

さて、ここからLaravel6での新機能です。
先ほどのJobに以下の関数を加えます。

app/Jobs/LogJob.php
    public function middleware() {
        return [new LogJobMiddleware];
    }

まだ作成していませんが、これによって、LogJobMiddlewareというミドルウェアを通過するようになります。

Middleware作成

さて、先ほど指定したLogJobMiddlewareというものを実際に作っていきましょう。
app/Http/Middleware/LogJobMiddleware.phpを作成し、以下のようにします。

app/Http/Middleware/LogJobMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Log;

class LogJobMiddleware
{
    /**
     * Process the queued job.
     *
     * @param  mixed  $job
     * @param  callable  $next
     * @return mixed
     */
    public function handle($job, Closure $next)
    {
        Log::info('LogJobMiddleware handled');
        return $next($job);
    }
}

LogJobが動くRouteを設定

ここでは、/logにアクセスが来たときに、LogJobが動くようにしてみましょう。
routes/web.phpに以下を追加します。

routes/web.php
Route::get('/log', function() {
    dispatch(new LogJob);
    return 'LogJob dispatched';
});

動作確認

さて、これで実装は完了です!
実際に試してみましょう。

以下のコマンドでサーバを立ち上げます。

php artisan serve & php artisan queue:work

確認する流れとしては、

  • ブラウザでhttp://localhost:8000/logにアクセスする
  • (LogJobがQueueに追加される→)ブラウザに「LogJob dispatched」と表示される
  • LogJobMiddlewareを通過し、LogJobMiddleware handledというログが残る
  • LogJobが実行され、LogJob handledというログが残る

といった感じになります。
ログはstorage/logs/laravel-XXXX-XX-XX.logで確認できるかと思います。

最後に

今回はかなりシンプルな例とするためにログを残すだけでしたが、Job Middlewareにカスタムロジックなどを記述することにより、Jobの記述を綺麗にできるかと思います。
最後まで読んでいただきありがとうございました。

関連記事

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3