Laravel同一控制器不同路由方法如何共享$request,Session读null怎么解决
问题根因
- Laravel默认
api.php中定义的路由归属api中间件组,该组默认没有启用Session中间件,所以你写入的Session数据不会被持久化,跨请求读取自然为null。 - 不建议直接将完整
Request对象存入Session,应该只序列化存储需要的请求输入数据即可。
可落地解决方案
方案1:给目标路由启用Session中间件
在app/Http/Kernel.php中找到$middlewareGroups下的api配置项,添加Session启动中间件:
'api' => [ \Illuminate\Session\Middleware\StartSession::class, // 新增该行 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
修改控制器代码,仅存储请求输入数据:
use Illuminate\Support\Facades\Session; class ABCController extends Controller { public function validation(Request $request) { // 可按需筛选字段,不需要全量存储时替换为$request->only(['字段1','字段2']) Session::put('request_data', $request->all()); Log::debug(Session::get('request_data')); } public function save() { Log::debug(Session::get('request_data')); // 数据用完不需要保留可主动清理:Session::forget('request_data'); } }
方案2:无Session场景改用缓存存储
如果是纯无状态API场景不适合开启Session,可以改用Laravel缓存系统存储数据,多用户场景下需要给缓存key加上用户唯一标识避免数据串用:
// validation方法中存储,设置10分钟过期 Cache::put('request_data_' . auth()->id(), $request->all(), 600); // save方法中读取对应数据 Cache::get('request_data_' . auth()->id());
内容的提问来源于stack exchange,提问作者trinitrotoluene
相关产品推荐
相关产品推荐

