Laravel中间件handle方法核心是接收请求、执行逻辑、决定是否放行并返回响应,关键在于调用$next($request)继续生命周期;必须返回Response对象,支持预/后处理、依赖注入,且不可忽略返回值。

Laravel中间件的handle方法核心是接收请求、执行逻辑、决定是否放行,并返回响应——关键在于调用$next($request)来继续请求生命周期。
handle方法的基本结构
每个中间件都必须实现handle方法,它接收两个参数:$request(当前请求实例)和$next(闭包,代表后续中间件或路由处理逻辑)。必须返回一个Response对象(可由$next($request)返回,也可自行构造)。
- 不调用
$next($request)→ 请求终止,后续中间件和路由不会执行 - 调用
$next($request)但未返回其结果 → PHP报错(函数无返回值) - 可在调用前后添加预处理或后处理逻辑(如日志、修改请求/响应)
常见写法示例
✅ 正确放行(最常用):
public function handle($request, Closure $next)
{
// 请求进入时的逻辑(如检查权限、记录IP)
if (! $request->user() || ! $request->user()->is_admin) {
abort(403);
}
// 执行后续流程并返回响应
return $next($request);
}
✅ 修改请求后放行:
public function handle($request, Closure $next)
{
$request->merge(['processed_by_middleware' => true]);
return $next($request);
}
✅ 修改响应后返回:
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('X-Processed-By', 'CustomMiddleware');
return $response;
}
注意返回值和异常处理
handle方法必须有明确返回值,且类型为\Illuminate\Http\Response或兼容响应(如redirect()、response()、view()等辅助函数返回值)。
- 直接
return response('Forbidden', 403);是合法终止 - 抛出异常(如
abort(401)、throw new AuthenticationException)会交由异常处理器,也属于有效退出方式 - 避免只写
$next($request);而不return——这会导致返回null,引发“Return value must be of type Response”错误
支持依赖注入(Laravel 5.3+)
handle方法支持在参数列表末尾注入服务(需放在$next之后),Laravel 自动解析:
public function handle($request, Closure $next, SomeService $service)
{
$service->log($request);
return $next($request);
}
不复杂但容易忽略。











