中间件可通过路由定义的middleware()方法链式绑定,如->middleware(['auth', 'throttle:60,1'])或->middleware('role:admin');分组用route::middleware()->group();自定义中间件需return响应或$next($request);顺序影响session、auth、csrf等依赖关系。

中间件怎么绑定到单个路由
直接在 Route::get() 或其他路由定义里用 middleware() 方法链式调用就行,这是最常用也最不容易出错的方式。
常见错误是把中间件名写错,比如写成 'auth' 却没在 app/Http/Kernel.php 的 $routeMiddleware 里注册,结果报错 Class auth does not exist;或者大小写不一致(Laravel 默认中间件名全小写)。
- 中间件名必须和
$routeMiddleware数组里的键完全一致 - 多个中间件用数组传入:
->middleware(['auth', 'throttle:60,1']) - 带参数的中间件要写成字符串形式:
->middleware('role:admin'),不能写成['role', 'admin']
Laravel 10+ 中间件分组怎么配
如果你有一组路由共用相同中间件,别一个个重复写,用 Route::middleware() 分组更干净,也避免漏配。
注意:分组只影响它包裹的路由,不会自动继承父级分组;而且 middleware() 分组必须在 Route::group() 内部使用,不能单独调用。
- 正确写法:
Route::middleware(['auth', 'verified'])->group(function () { ... }); - 错误写法:
Route::middleware([...])->get(...)—— 这会报Call to undefined method - 分组内再嵌套分组没问题,但中间件会叠加,不是覆盖
自定义中间件里怎么终止请求或跳转
关键就两行:return $next($request) 放行,其他情况返回响应即可。Laravel 不强制你 throw 异常或 return redirect(),但返回值必须是 Illuminate\Http\Response 或兼容对象。
容易踩的坑是忘记 return,比如写了 redirect()->route('login') 却没加 return,结果后续代码继续执行,最后 PHP 报 Headers already sent。
- 放行必须写
return $next($request),少一个return就崩 - 跳转用
return redirect()->route('login'),不能只写redirect() - 返回 JSON 错误时,用
return response()->json([...], 403),状态码别漏
中间件顺序为什么会影响 auth 和 csrf 的行为
中间件是按注册顺序从外到内执行,再从内到外返回。比如 web 中间件组里 StartSession 必须在 Authenticate 前面,否则 session 没初始化,auth() 查不到用户。
同理,VerifyCsrfToken 如果放在 EncryptCookies 后面,解密失败导致 token 验证永远过不了 —— 因为 cookie 还没解密,拿不到原始值。
- 查看顺序:看
app/Http/Kernel.php的$middlewareGroups['web']数组顺序 - 自定义中间件如果依赖 session 或 auth,得确保它排在
StartSession和Authenticate之后 - 调试时可以用
dd($request->session()->all())看 session 是否已可用











