LoginSignup
29
20

More than 3 years have passed since last update.

Laravelで複数Middlewareを指定するときは優先度も指定しよう

Posted at

3行まとめ

  1. LaravelのMiddlewareは書いた順に実行されるわけではない
  2. LaravelのバージョンをアップしたりするとMiddlewareの実行順が変わったりして危険
  3. app/Http/Kernel.php$middlewareGroupsを指定して、優先度を明確にしましょう。

RouteでMiddlewareを設定する

LaravelでMiddlewareを指定するときにはどこで指定していますか?私はroute.phpのrouteの指定でmiddlewareを設定することがよくあります。以下の様な感じですね。

<?php
Route::get('/hoge', 'HogeController@index')
        ->middleware(['a_middleware'])
        ->name('hoge.index');

このように指定して/hogeにアクセスが来たときにa_middlewareを実行します。

では適用したいミドルウェアが複数あるときはどうでしょうか?以下のように書きますね。

<?php
Route::get('/hoge', 'HogeController@index')
        ->middleware(['a_middleware', 'b_middleware'])
        ->name('hoge.index');

このとき、書いたプログラマーとしてはa_middleware→b_middlwareという順番で実行されると期待するはずです。

しかし残念ながらそうではありません。実際にLaravelのバージョンをアップグレードしたらMiddlewareの実行順が変わってテストが落ちたので慌てて優先度を設定するということがありました:sob:

Middlewareには優先度がある

実はドキュメントにも書かれているのですが、LaravelではMiddlewareの優先度を指定することが出来ます。
https://laravel.com/docs/8.x/middleware#sorting-middleware

しかしこの優先度は事前にapp/Http/Kernel.phpに書いておくと反映されるという形式のもので、routeの設定に書いたらその順番に実行してくれるというようなものではありません。

<?php

class Kernel extends HttpKernel
{

    ...  ...

    protected $middlewarePriority = [
        \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\Session\Middleware\AuthenticateSession::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];

むしろroute.phpの配列に渡している順番は保証されないと思って、信用せずに書いたほうが良いでしょう。

29
20
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
29
20