Authより前に処理を差し込みたい
Laravel10の開発でAuthよりも前に処理を差し込みたい場合、どうすればいいのか書いていきます。
先に結論を言っておくと公式ドキュメントの「ミドルウェアの順序」の部分に従ってKernel.phpに$middlewarePriorityを定義します。
https://readouble.com/laravel/10.x/ja/middleware.html
protected $middlewarePriority = [
\Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class,
\Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,
\Illuminate\Contracts\Session\Middleware\AuthenticatesSessions::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
// ここから追加
\App\Http\Middleware\BeforeAuth::class,
\App\Http\Middleware\Authenticate::class,
];
$middlewarePriorityの部分はvendor/laravel/framework/src/Illuminate/Contracts/Http/Kernel.phpから引っ張ってきたほうが安全だと思います。
なぜ記事にしているのか
これ以降は問題解決後に暇だったら読んでください
middlewareの順番なんてroutes/web.phpのRoute::middleware(['before_auth', 'auth'])にするだけで解決するのでは?と思うかもしれませんが、どうもLaravelの機能に依存しているmiddlewareだとそうはいかないっぽいです。
ChatGPT君に聞いてみた結果
質問:
これはlaravelが提供するauth機能より前にbefore_authを実行するために必要であり、自作したmiddlewareの場合は$middlewarePrioriryに記載せずとも実行できるということでしょうか?
ChatGPT:
はい、その通りです。自作のミドルウェア同士で順序を管理する場合、通常は $middlewarePriority に記載しなくても、ルートで指定した順序に従って実行されます。
Laravelが提供する auth ミドルウェアとの順序関係
Laravelが提供する auth ミドルウェアは、一般的にフレームワークの一部として重要な役割を果たすため、他のミドルウェアと競合する可能性があります。特に auth ミドルウェアは認証に関わるため、その前に特定の処理を確実に実行したい場合は、順序を明示的に指定する必要があります。
$middlewarePriority は、そのような競合が発生する場合に使用するもので、Laravelが提供するミドルウェア (auth など) と自作ミドルウェアとの間で実行順序を明確にするために役立ちます。
自作ミドルウェア同士の順序
自作ミドルウェア同士であれば、以下のようにルートで指定した順序に従って実行されます。
Route::get('/dashboard', function () {
// ダッシュボードのコード
})->middleware(['before_auth', 'another_middleware']);
この場合、before_auth が先に実行され、その後 another_middleware が実行されます。特に競合するようなミドルウェアがない限り、これで問題なく機能します。
Laravelの提供する機能だと依存関係が影響するの$middlewareProiorityで明示的に指定しないといけないんだとか。
ChatGPTくんのことを鵜呑みにしてはいけないのであくまで参考程度、可能性の話くらいの気持ちでいてください。
ちなみになんでそんなことに?と思ってvendor以下を見ようとしましたが、めんどくさそうなんで断念しました。
知りたい人はこの記事を参考にvendor以下読み解いていってほしいな...
LaravelのMiddlewareはどのように動いているのか?
Auth前に処理を差し込む記事があまり見当たらず解決に時間かかってしまったので、同じく困っている人の参考になればと思います。