Documents

LaravelのRequestフィルター


ご存知の通りLaravelはすべてのリクエストはindex.phpをすべて通ります。なので、すべてのリクエストはここでフィルタリングできることになります。とはいえindex.phpに書くのではなくてリクエスト処理をする際にMiddlewareを使うというやり方がすでにあるので、これを使うということになります。ミドルウェアについはここでは詳しいお話は言及しません。

ミドルウェアを作成します。

artisanコマンドがすでにあるので、それで作成します。

$ ./vendor/bin/sail  artisan make:middleware RequestFilter

app/Http/Middleware/RequestFilter.phpが作成されます。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class RequestFilter
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        echo 'Filtering';
        return $next($request);
    }
}

return $next($request);前に書いた処理は各コントローラに渡される前に処理されます。
(諸々書いた際にはLaravelのキャッシュを削除しておきましょう。ここらの機能はキャッシュされて高速化を実現しているようです。)
ただここで書いたコードをすべてのページで反映させるためには、もう少し上位で呼び出すように設定する必要があります。

すべてのページでリクエストを処理する

それからapp/Http/Kernel.phpのプロパティーにサービスを設定します。

protected $middleware = [
        ...
        /* custom filter */
        \App\Http\Middleware\RequestFilter::class,
    ];

これですべてのリクエストを処理するフィルターが作成されます。
ここらで処理される要件というのは、いろいろあると思いますが、ApacheやNiginxでアクセスログを取得できないとき、オリジナルのスロットルの作成や、IP制限などのセキュリティー云々などです。通常WEBサーバー側にやらせていたことがいろいろできるかと思います。




2022.07.11