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
相关产品推荐
相关产品推荐

