0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Laravel11.x】Middlewareの設定方法が変わったようなのでおさらい

Last updated at Posted at 2025-02-05

お疲れ様です。

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 というファイルの中にその場所が確保されているのです。

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

この順番を制御したい場合、以下のように記載することができます。

bootstrap/app.php
    ->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に合わせた処理のグループ化も可能です。
この場合、以下のようにグローバルと別にグループを作成します。

bootstrap/app.php
    ->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,
        ]);
    })

また、実務上はエイリアスを指定しルーティングに割り当てるシーンが多いかと思いますが、こちらは以下のように登録します。

bootstrap/app.php
use App\Http\Middleware\AddFunction;

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'add_function' => AddFunction::class
    ]);
})
route/web.php
Route::get('/hoge', function () {
    // ...
})->middleware('add_function');

仕様の変更によってキャッチアップは必要ですが、実行順序が prepend/append で明示的なのと、10以前の配列定義に比べメソッドチェーンによる記述が直感的であるため、新規の方にはスッキリ分かりやすい作りになったかなという印象です。

その他詳細な設定は公式をご確認ください。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?