Zenn
🍰

Laravel11以降のミドルウェアの設定の書き方

2025/03/29に公開
1

はじめに

Laravel10から11以降にバージョンを上げた時に書き方が大きく変わりました。

その中でLaravel10まではapp/Http/Kernel.phpでミドルウェアのグループやエイリアスの設定などを行なっていたが、Laravel11以降ではbootstrap/app.phpに書くように変わりました。

そこで今回はLaravel11以降の書き方を少し整理したいと思います。

環境

  • PHP 8.4.5
  • Laravel 12.3.0

ミドルウェアの登録

まずはすべてのHTTPリクエストに対して実行するミドルウェアの指定する書き方です。

Laravel10

app/Http/Kernel.php$middlewareプロパティに実行するミドルウェアを指定します。

https://github.com/laravel/laravel/blob/v10.3.3/app/Http/Kernel.php#L16-L24

$middlewareプロパティの配列の要素を書き換えることで実行する順番を変えたり、独自のミドルウェアを指定することもできます。

    protected $middleware = [
        \App\Http\Middleware\TrimStrings::class, // trimを一番最初に動くように順番を変える
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\AAA::class, // 独自のミドルウェアを追加
    ];

Laravel12

bootstrap/app.phpwithMiddlewareメソッドを使ってミドルウェアを指定します。

https://github.com/laravel/laravel/blob/v12.0.3/bootstrap/app.php#L13-L15

初期では処理が何も書かれていないです。
これはwithMiddlewareメソッドの引数のクロージャの引数で指定しているIlluminate\Foundation\Configuration\Middlewareクラスにデフォルトで指定しているミドルウェアがあるためです。

https://github.com/laravel/framework/blob/12.x/src/Illuminate/Foundation/Configuration/Middleware.php#L451-L463

Laravel10同様にミドルウェアを指定する場合は、appendメソッドを使うと最後に追加、prependメソッドを使うと最初に追加します。

use App\Http\Middleware\AAA;
use App\Http\Middleware\BBB;
// use App\Http\Middleware\CCC;
// use App\Http\Middleware\DDD;
// use App\Http\Middleware\EEE;
// use App\Http\Middleware\FFF;

->withMiddleware(function (Middleware $middleware) {
    $middleware->append(AAA::class);
    $middleware->prepend(BBB::class);

    // 配列を使えば複数指定することもできる
    // $middleware->append([CCC::class, DDD::class]);
    // $middleware->prepend([EEE::class, FFF::class]);
})

また、replaceメソッドを使うことでデフォルトのミドルウェアを書き換えることができます。
さらにデフォルトで指定しているミドルウェアを削除する場合はremoveメソッドを使います。

use App\Http\Middleware\GGG;
//use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull:
use Illuminate\Foundation\Http\Middleware\TrimStrings;
use Illuminate\Http\Middleware\ValidatePostSize;

->withMiddleware(function (Middleware $middleware) {
    $middleware->replace(TrimStrings::class, GGG::class);

    $middleware->remove(ValidatePostSize::class);

    // removeメソッドは配列を使えば複数指定することもできる
    // $middleware->remove([TrimStrings::class, ConvertEmptyStringsToNull::class]);
})

それぞれのメソッドを使って指定を書き換えることができますが、useメソッドを使うことで一括で書き換えることもできます。

->withMiddleware(function (Middleware $middleware) {
    $middleware->use([
        \App\Http\Middleware\HHH::class,
        \Illuminate\Http\Middleware\ValidatePathEncoding::class,
        \Illuminate\Foundation\Http\Middleware\InvokeDeferredCallbacks::class,
        \Illuminate\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Http\Middleware\GGG::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\III::class,
    ]);
})

ミドルウェアグループの登録

つぎに複数のミドルウェアを1つのキーにまとめて、ルートに割り当てる場合の書き方です。

Laravel10

app/Http/Kernel.php$middlewareGroupsプロパティに実行するミドルウェアを指定します。

https://github.com/laravel/laravel/blob/v10.3.3/app/Http/Kernel.php#L31-L46

デフォルトでwebapiの2つのミドルウェアグループが定義されている。
この2つはミドルウェアグループはapp/Providers/RouteServiceProvider.phpで対応するwebapiルートファイルを自動で読み込みを行う。

https://github.com/laravel/laravel/blob/v10.3.3/app/Providers/RouteServiceProvider.php#L25-L39

$middlewareGroupsプロパティのwebapiの配列の要素を書き換えることで実行する順番を変えたり、独自のミドルウェアを指定することもできます。

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\VerifyCsrfToken::class, // csrfトークンのチェックを一番最初に動くように順番を変える
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\AAA::class, // 独自のミドルウェアを追加
        ],

        'api' => [
            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

また、ミドルウェアグループを追加することもできる。
追加したミドルウェアグループはルートに割り当てることもできる。

    protected $middlewareGroups = [
        'web2' => [
            \App\Http\Middleware\AAA::class,
            \App\Http\Middleware\BBB::class,
            \App\Http\Middleware\CCC::class,
        ],
    ];
Route::get('/', function () {
    // ...
})->middleware('web2');
    public function boot(): void
    {
        $this->routes(function () {
            Route::middleware('web2')
                ->group(base_path('routes/web2.php'));
        });
    }

Laravel12

ミドルウェアの登録同様にbootstrap/app.phpwithMiddlewareメソッドを使ってミドルウェアグループの登録を行います。
また、Laravel10同様、webapiがデフォルトのミドルウェアグループとして定義しています。

https://github.com/laravel/framework/blob/12.x/src/Illuminate/Foundation/Configuration/Middleware.php#L482-L500

これらのミドルウェアグループに独自のミドルウェアを登録する場合はwithMiddlewareメソッドの引数のクロージャの引数で指定しているIlluminate\Foundation\Configuration\Middlewareクラスに定義しているwebメソッド、apiメソッドを使います。

use App\Http\Middleware\AAA;
use App\Http\Middleware\BBB;

->withMiddleware(function (Middleware $middleware) {
    // webミドルウェアグループの最後に追加
    $middleware->web(append: [
        AAA::class,
    ]);

    // apiミドルウェアグループの最初に追加
    $middleware->api(prepend: [
        BBB::class,
    ]);
})

また、replaceを使うことでデフォルトのミドルウェアを書き換えることができます。
さらにデフォルトで指定しているミドルウェアを削除する場合はremoveを使います。

use App\Http\Middleware\GGG;
use Illuminate\Foundation\Http\Middleware\TrimStrings;
use Illuminate\Http\Middleware\ValidatePostSize;

->withMiddleware(function (Middleware $middleware) {
    $middleware->web(replace: [
        TrimStrings::class, GGG::class
    ]);

    $middleware->web(remove: [
        ValidatePostSize::class,
    ]);
})

また、groupメソッドを使って、ミドルウェアグループの登録ができる。

use App\Http\Middleware\AAA;
use App\Http\Middleware\BBB;

->withMiddleware(function (Middleware $middleware) {
    // webミドルウェアグループの最後に追加
    $middleware->group('web2' [
        AAA::class,
        BBB::class,
    ]);
})

エイリアスの登録

ミドルウェアへエイリアスを割り当てる場合の書き方です。

Laravel10

app/Http/Kernel.php$middlewareAliasesプロパティにエイリアスを設定したいミドルウェアを指定します。

デフォルトでいくつか登録済みです。

https://github.com/laravel/laravel/blob/v10.3.3/app/Http/Kernel.php#L55-L67

    protected $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'aaa' => \App\Http\Middleware\AAA::class,   // 独自のミドルウェアを指定
    ];

Laravel12

ミドルウェアの登録同様にbootstrap/app.phpwithMiddlewareメソッドを使ってミドルウェアのエイリアスを設定できます。

Laravel10同様にデフォルトでいくつか登録済みです。

https://github.com/laravel/framework/blob/12.x/src/Illuminate/Foundation/Configuration/Middleware.php#L779-L802

実際に設定する場合はwithMiddlewareメソッドの引数のクロージャの引数で指定しているIlluminate\Foundation\Configuration\Middlewareクラスに定義しているaliasメソッドを使います。

use App\Http\Middleware\AAA;

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'aaa' => AAA::class
    ]);
})

まとめ

ミドルウェアの設定についてLaravel11以降で変わった部分を整理してみました。
書きながら思ったのは、大きく変わっていますね。これをバージョンを上げる時に変更するのはお勧めしないとアップグレードガイドに書かれているのも頷けます。

https://laravel.com/docs/11.x/upgrade#application-structure

おそらく他にもありそうなので、気づいた箇所は適宜追記したいと思います。

GitHubで編集を提案
1

Discussion

ログインするとコメントできます