You need to enable JavaScript to run this app. Laravel 8 登录重定向触发Serialization of 'PDO' is not allowed错误
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8 登录重定向触发Serialization of 'PDO' is not allowed错误

Laravel 8 登录抛出 Serialization of 'PDO' is not allowed 问题排查方向

最优先定位的触发点

  • 该错误和你重定向时传入的闪存数据直接相关:代码中$users = User::where('id', '!=', \auth()->user()->id); 没有调用get()/paginate()等触发数据库查询的方法,最终拿到的是Eloquent查询构造器(Builder)实例,而非可序列化的集合、数组或普通标量数据。
  • 这个查询构造器实例内部绑定了当前数据库连接的PDO对象,当你调用->with(compact('users'))把构造器实例作为闪存数据写入Session时,Laravel会对Session存储的所有数据做序列化处理,碰到无法序列化的PDO对象,就会直接抛出目标错误。
  • 快速验证方式:将对应代码修改为$users = User::where('id', '!=', \auth()->user()->id)->get();后重新走登录流程,大概率序列化错误会直接消失。

关联场景排查

  • 关于你提到的“替换重定向逻辑为直接返回视图时URL停留在旧页面”:这是Laravel的正常运行机制——在authenticated回调中直接返回视图响应,不会触发302跳转,浏览器地址栏自然会停留在登录POST的请求地址,不属于异常逻辑。只要修正了闪存数据的问题,正常的redirect()跳转就会带着正确的响应头跳转到目标页面。
  • 当使用spatie/laravel-permissions扩展包时,如果临时修改上面的查询代码后依然出现同类序列化错误,可以临时把Session驱动切换为array模式测试:如果此时流程正常,说明Session存储的数据里依然存在不可序列化的数据库实例,重点检查闪存数据、用户模型的序列化配置即可。

代码优化建议

  • 你当前的authenticated方法存在大量冗余逻辑,框架执行到这个回调时,已经完成了登录状态校验,不需要额外写Auth::check()做二次判断,也不需要反复调用Auth::user()重复获取当前登录用户,直接使用方法传入的$user参数即可:
    protected function authenticated(Request $request, $user)
    {
        if ($user->hasRole(['admin-user', 'super-user'])) {
            $users = User::where('id', '!=', $user->id)->get();
            return redirect()->to('/admin_dashboard')->with(compact('users'));
        }
        return redirect('/home');
    }
    
  • 如果$users数据集较大,不建议用with()闪存到Session,应该直接在AdminDashboardController@index中查询需要的用户列表传给视图,减少Session的存储开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 22:27:01