お疲れ様です。
larave11の環境で個人制作を始めたところ、Middleware(ミドルウェア)の設定方法が色々変わっていて驚いたので、備忘録として書き留めておこうと思います。
Middleware って何?という場合はまずこちらを。
以下はlaravel11のプロジェクトスタート時のファイル構成の一部ですが、
├── README.md
├── app
│ ├── Http
│ │ └── Controllers
│ ├── Models
│ │ └── User.php
│ └── Providers
│ └── AppServiceProvider.php
├── artisan
├── bootstrap
│ ├── app.php
│ ├── cache
│ │ ├── events.php
│ │ └── ...
│ └── providers.php
├── ...
10までのバージョンには app/Http
配下にあった Middleware
ディレクトリや、その設定を管理するKernel.php
が見当たりません。
では、Middlewareの登録や設定をどこで行うかというと、bootstrap/app.php
というファイルの中にその場所が確保されているのです。
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
上記の withMiddleware
クロージャ内に、コントローラの実行前後に行いたい処理を追加していきます。
例えばいくつかの Middleware を作成するとします。
% php artisan make:middleware FirstMiddleware
この順番を制御したい場合、以下のように記載することができます。
->withMiddleware(function (Middleware $middleware) {
// 最初に実行する処理
$middleware->prepend(FirstMiddleware::class);
// 順次実行する処理
$middleware->append(SecondMiddleware::class);
$middleware->append(ThirdMiddleware::class);
// 最後に実行する処理
$middleware->append(LastMiddleware::class);
})
prepend()
は処理の先頭に追加され、append()
は処理の末尾に追加されますので、上記は First→Secound→Third→Last
の順に実行されることとなります。
また、10以前のMiddleware同様に、web/apiに合わせた処理のグループ化も可能です。
この場合、以下のようにグローバルと別にグループを作成します。
->withMiddleware(function (Middleware $middleware) {
// グローバルミドルウェア(全ルートで実行)
$middleware->prepend(FirstExecuteMiddleware::class);
$middleware->append(LastExecuteMiddleware::class);
// Webルート用のミドルウェア
$middleware->web(append: [
WebSecondMiddleware::class,
WebThirdMiddleware::class,
]);
// APIルート用のミドルウェア
$middleware->api(append: [
ApiSecondMiddleware::class,
ApiThirdMiddleware::class,
]);
})
また、実務上はエイリアスを指定しルーティングに割り当てるシーンが多いかと思いますが、こちらは以下のように登録します。
use App\Http\Middleware\AddFunction;
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'add_function' => AddFunction::class
]);
})
Route::get('/hoge', function () {
// ...
})->middleware('add_function');
仕様の変更によってキャッチアップは必要ですが、実行順序が prepend/append で明示的なのと、10以前の配列定義に比べメソッドチェーンによる記述が直感的であるため、新規の方にはスッキリ分かりやすい作りになったかなという印象です。
その他詳細な設定は公式をご確認ください。