如何实现Laravel中间件缓存响应的机制?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1012个文字,预计阅读时间需要5分钟。
由于 Laravel 的中间件链是单向的,`handle` 方法返回的 `Response` 对象会被后续中间件连续处理。但如果在中间件中手动调用 `response()` 方法,则会跳过后续中间件的执行。
正确做法是:在中间件中判断是否命中缓存,若命中就直接 return 缓存的 Response;否则放行,再在响应返回前通过 ->withHeaders() 或 ->setCache() 注入缓存策略。别试图“修改”已存在的响应对象。
- 缓存读取必须在
handle开头做,用Cache::get($key)拿序列化的Response - 写入缓存必须在
$next($request)之后,且只对 200 状态、GET 请求等安全场景操作 - 注意
Response序列化时会丢失部分运行时状态(如回调、资源句柄),只缓存可序列化字段(内容、状态码、头)
Response::setCache() 和手动设 Cache-Control 头的区别?
Response::setCache() 是 Laravel 封装的快捷方法,它会同时设置 Cache-Control、Expires、Last-Modified 等多个头,并自动处理 ETag 计算(如果启用)。
本文共计1012个文字,预计阅读时间需要5分钟。
由于 Laravel 的中间件链是单向的,`handle` 方法返回的 `Response` 对象会被后续中间件连续处理。但如果在中间件中手动调用 `response()` 方法,则会跳过后续中间件的执行。
正确做法是:在中间件中判断是否命中缓存,若命中就直接 return 缓存的 Response;否则放行,再在响应返回前通过 ->withHeaders() 或 ->setCache() 注入缓存策略。别试图“修改”已存在的响应对象。
- 缓存读取必须在
handle开头做,用Cache::get($key)拿序列化的Response - 写入缓存必须在
$next($request)之后,且只对 200 状态、GET 请求等安全场景操作 - 注意
Response序列化时会丢失部分运行时状态(如回调、资源句柄),只缓存可序列化字段(内容、状态码、头)
Response::setCache() 和手动设 Cache-Control 头的区别?
Response::setCache() 是 Laravel 封装的快捷方法,它会同时设置 Cache-Control、Expires、Last-Modified 等多个头,并自动处理 ETag 计算(如果启用)。

