You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel访问Session用户ID报Cannot access offset of type string on string错误

错误原因
  • 存储Session时给$user变量套了双引号,PHP会自动触发字符串类型转换:Laravel的Eloquent模型的__toString方法默认会将模型序列化为JSON字符串,因此你实际存入Session的是字符串类型的JSON数据,不是数组或模型实例。
  • 后续读取时你尝试用数组下标['id']的方式访问字符串类型的值,不符合PHP语法要求,因此抛出TypeError: Cannot access offset of type string on string错误。
修复方案

方案1(推荐:直接存储模型实例)

修改登录逻辑中Session存储的代码,去掉$user外层的双引号即可:

// 修改前
$req->session()->put("user", "$user");
// 修改后
$req->session()->put("user", $user);

修改后可以直接通过两种方式读取ID:

// 方式1:对象属性访问
$cart->user_id = $req->session()->get('user')->id;
// 方式2:数组下标访问(Eloquent模型实现了ArrayAccess接口,支持该写法)
$cart->user_id = $req->session()->get('user')['id'];

方案2:存储为纯数组

如果你不需要用到模型的其他方法,也可以转成数组存储:

$req->session()->put("user", $user->toArray());

读取时直接用原有数组下标访问逻辑即可,无需修改读取代码。

方案3(不推荐:兼容现有错误存储逻辑)

如果不方便修改存储逻辑,可以在读取时先把JSON字符串转成数组:

$user = json_decode($req->session()->get('user'), true);
$cart->user_id = $user['id'];

最佳实践提示:生产环境建议仅将用户ID存入Session,读取时从数据库查询完整用户数据,避免Session存储的数据和数据库实际数据不一致的问题。

内容的提问来源于stack exchange,提问作者SwottingDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:36:05