Laravel11以降のミドルウェアの設定の書き方
はじめに
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
プロパティに実行するミドルウェアを指定します。
$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.php
のwithMiddleware
メソッドを使ってミドルウェアを指定します。
初期では処理が何も書かれていないです。
これはwithMiddleware
メソッドの引数のクロージャの引数で指定しているIlluminate\Foundation\Configuration\Middleware
クラスにデフォルトで指定しているミドルウェアがあるためです。
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
プロパティに実行するミドルウェアを指定します。
デフォルトでweb
とapi
の2つのミドルウェアグループが定義されている。
この2つはミドルウェアグループはapp/Providers/RouteServiceProvider.php
で対応するweb
とapi
ルートファイルを自動で読み込みを行う。
$middlewareGroups
プロパティのweb
、api
の配列の要素を書き換えることで実行する順番を変えたり、独自のミドルウェアを指定することもできます。
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.php
のwithMiddleware
メソッドを使ってミドルウェアグループの登録を行います。
また、Laravel10同様、web
とapi
がデフォルトのミドルウェアグループとして定義しています。
これらのミドルウェアグループに独自のミドルウェアを登録する場合は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
プロパティにエイリアスを設定したいミドルウェアを指定します。
デフォルトでいくつか登録済みです。
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.php
のwithMiddleware
メソッドを使ってミドルウェアのエイリアスを設定できます。
Laravel10同様にデフォルトでいくつか登録済みです。
実際に設定する場合はwithMiddleware
メソッドの引数のクロージャの引数で指定しているIlluminate\Foundation\Configuration\Middleware
クラスに定義しているalias
メソッドを使います。
use App\Http\Middleware\AAA;
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'aaa' => AAA::class
]);
})
まとめ
ミドルウェアの設定についてLaravel11以降で変わった部分を整理してみました。
書きながら思ったのは、大きく変わっていますね。これをバージョンを上げる時に変更するのはお勧めしないとアップグレードガイドに書かれているのも頷けます。
おそらく他にもありそうなので、気づいた箇所は適宜追記したいと思います。
Discussion