Laravel 8.x 中间件通过 return 响应实例(如 response()、redirect()、abort())中断请求流程;需确保每个分支都有 return,避免遗漏导致 $next($request) 被执行。

在 Laravel 8.x 中,中间件返回自定义响应非常直接:只需在 handle 方法中直接 return 一个响应实例(如 response()、redirect() 或 abort()),Laravel 就会中断请求生命周期,不再执行后续中间件和控制器逻辑。
使用 response() 返回 JSON 或文本
适合 API 场景,比如权限校验失败时返回结构化错误:
public function handle($request, Closure $next)
{
if (! $request->user() || ! $request->user()->hasRole('admin')) {
return response()->json([
'message' => 'Unauthorized access',
'code' => 403
], 403);
}
return $next($request);
}
用 redirect() 跳转到登录页或提示页
适用于 Web 请求,比如未登录用户访问后台路由:
- 返回重定向响应:
return redirect('/login'); - 带错误提示:
return redirect('/login')->with('error', '请先登录'); - 临时跳转(302)或永久跳转(301)可显式指定状态码
调用 abort() 快速触发异常响应
适合标准 HTTP 错误场景,Laravel 会自动渲染对应错误视图(如 403.blade.php):
-
abort(403);—— 返回 403 页面 -
abort(404, '页面不存在');—— 自定义消息 -
abort(500);—— 触发 500 错误处理流程
注意:不要忘记调用 $next($request)
只有在放行请求时才调用它。一旦你 return 了响应,后续逻辑就停止了。常见错误是漏掉 return 关键字,或在条件分支中遗漏 $next():
// ❌ 错误:没有 return,$next() 被执行,即使前面已判断不通过
if (! $request->user()) {
response()->json(['error' => 'Unauthorized'], 401);
} // 缺少 return → 控制器仍会被执行
// ✅ 正确:明确 return 响应
if (! $request->user()) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $next($request);











