概要
つい最近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に変更します。
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を用意してみました。
use Illuminate\Support\Facades\Log;
class LogJob implements ShouldQueue
{
//
public function handle()
{
Log::info('LogJob handled');
}
さて、ここからLaravel6での新機能です。
先ほどのJobに以下の関数を加えます。
public function middleware() {
return [new LogJobMiddleware];
}
まだ作成していませんが、これによって、LogJobMiddlewareというミドルウェアを通過するようになります。
Middleware作成
さて、先ほど指定したLogJobMiddlewareというものを実際に作っていきましょう。
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
に以下を追加します。
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の記述を綺麗にできるかと思います。
最後まで読んでいただきありがとうございました。