在单条路由上使用中间件需通过->middleware()链式调用,支持闭包和控制器路由;多个中间件传数组,带参中间件须写为字符串如'role:admin',常见失效原因包括拼写错误、未注册别名或web/api组混用。

在单条路由上使用中间件是最常用、最直接的方式,适合权限控制、登录验证、邮箱确认等场景。关键就是用 ->middleware() 方法链式调用,写在路由定义末尾即可。
怎么写:基本语法
闭包路由和控制器路由都支持,写法一致:
- 闭包路由:
Route::get('/dashboard', function () { return view('dashboard'); })->middleware('auth'); - 控制器路由:
Route::get('/profile', [ProfileController::class, 'show'])->middleware('verified'); - 命名路由加中间件:
Route::get('/settings', [SettingsController::class, 'edit'])->name('settings.edit')->middleware('can:edit-settings');
多个中间件和带参数的写法
多个中间件必须传数组;带参数的中间件必须写成字符串,不能拆开:
- 多个中间件(顺序重要):
->middleware(['auth', 'throttle:60,1', 'verified']) - 带参数的中间件(如角色检查):
->middleware('role:admin')✅
错误写法:->middleware(['role', 'admin'])❌ 或->middleware('role', 'admin')❌ - 参数支持多个,用逗号分隔:
->middleware('role:admin,editor')
常见失效原因和避坑点
中间件写了却不生效?多数是以下问题:
- 中间件名拼错或大小写不对:比如注册的是
'auth',却写了'Auth'或'authentication' - 没在
app/Http/Kernel.php的$routeMiddleware数组里注册该别名,例如漏了'role' => \App\Http\Middleware\CheckRole::class, - 用了 API 路由但中间件依赖 session(如
auth),而api组默认不启用 session —— 此时应改用auth:sanctum或自定义无状态鉴权中间件 - 路由定义在
api.php中,却绑定了只注册在web组里的中间件(如verified)
小技巧:快速测试中间件是否触发
在自定义中间件的 handle() 方法开头加一行日志或 dump:
info('CheckRole middleware triggered for '.request()->url());- 或临时加
dd('hit');看是否执行到这一步 - 再配合
php artisan route:list确认该路由确实带上了对应中间件名











