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

