Laravel11では、これまでとミドルウェアの登録方法が色々と変わっています。
Laravel10までは app/Http/Kernel.phpにミドルウェアを登録していましたが、Laravel11では、bootstrap/app.phpにミドルウェアを登録します。
本記事では、Laravel11でのミドルウェアの登録方法を分かりやすく説明しますね。
Laravel10からの違いで悩んだら、ご覧ください。
Laravel11でのミドルウェアの登録方法
たとえば、adminユーザーのみが見れるページを作るとします。
ミドルウェアはこれまでどおり、下記コマンドで作成可能です。コマンド実行後、app/Http/Middlewareの中にミドルウェアファイルができます。
今回はAdminCheckMiddlewareを作りますが、ミドルウェアの名前はお好みで変えてください。
1 |
php artisan make:middleware AdminCheckMiddleware |
あらかじめ、usersテーブルに “role”カラムを作成しておき、カラムに”admin”と入っていたら、admin(管理者)ユーザーということにします。コード例は次のとおりです。
【AdminCheckMiddlewareコード例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class AdminCheckMiddleware { /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next): Response { // ログインユーザーのロールがadminなら次に進める if (Auth::user()->role == 'admin') { return $next($request); } // 権限がない場合は403エラーを返す abort(403, 'Unauthorized access.'); } } |
作成したミドルウェアを登録します。bootstrap/app.phpファイルに次のようにいれます。
【bootstrap/app.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) // 作成したミドルウェアを登録 ->withMiddleware(function (Middleware $middleware) { $middleware->alias([ 'admin.check' => AdminCheckMiddleware::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { // })->create(); |
AdminCheckMiddlewareを使用する際に、admin.checkというエイリアスを使います。エイリアスとは、本来の名前やクラス名の代わりに、より短く簡単な名前を付ける仕組みです。
エイリアスは「あだ名」と考えてしまうと分かりやすいですよ。
これでミドルウェアができました。実際に、管理者しか見れないページにミドルウェアを設定するには、次のようにルート設定を記述します。
【web.php】
1 2 3 4 |
// 管理者しか見れないページ Route::get('/admin', function () { return view('admin'); })->middleware(['auth', 'admin.check'])->name('admin'); |
おまけ:ミドルウェアの実行順序
なお、Webアプリ全体に適用されるグローバルミドルウェアというものがありますが、このグローバルミドルウェアよりも先、または後にミドルウェアを実行したい場合は、appendやprependを使用します。
公式マニュアルには次のように書かれています。
append
メソッドは、ミドルウェアをグローバルミドルウェアリストの最後に追加します。ミドルウェアをリストの先頭に追加したい場合は、prepend
メソッドを使うべきです。
https://readouble.com/laravel/11.x/ja/middleware.html
appendを使用すると、指定したミドルウェアはグローバルミドルウェアよりも後に実行されます。prependを使用すると、指定したミドルウェアはグローバルミドルウェアよりも先に実行されます。
【append利用例】
1 2 3 4 5 6 7 |
// 作成したミドルウェアを登録 ->withMiddleware(function (Middleware $middleware) { $middleware->alias([ 'admin.check' => AdminCheckMiddleware::class, ]); $middleware->append(AdminCheckMiddleware::class); }) |
CSRF除外設定
なおCSRF保護から除外したいパスは、これまではMiddleware/VerifyCsrfTokenにいれていました。Laravel11では、これもbootstrap/app.phpに記述します。たとえば/stripeというパスをCSRF除外にするには、次のように書きます。
【bootstrap/app.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?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', // api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', // channels: __DIR__.'/../routes/channels.php', health: '/up', ) // CSRF除外 ->withMiddleware(function (Middleware $middleware) { $middleware->validateCsrfTokens(except: [ '/stripe', ]); }) ->withExceptions(function (Exceptions $exceptions) { // })->create(); |
TrimStrings除外設定
TrimStringsから除外するパスも同じような形で、bootstrap/app.phpに記述します。たとえば/passwordというパスをTrimStrings除外にするには、次のように書きます。
*TrimStrnigsは、HTTPリクエストで送信されたデータの文字列値から、先頭と末尾の空白を自動的に削除(トリム)するミドルウェアです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?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', // api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', // channels: __DIR__.'/../routes/channels.php', health: '/up', ) // TrimStrings除外 ->withMiddleware(function (Middleware $middleware) { $middleware->trimStrings(except: [ '/password', ]); }) ->withExceptions(function (Exceptions $exceptions) { // })->create(); |
さいごに
以上、Laravel11からのmiddlewareについてでした。下記公式マニュアルも参考にしてください。
Laravel11になってから変わった他の部分については、下記記事にまとめています。