Laravel重置密码报错User实体无email属性,需取关联队长邮箱发信咨询
解决方案
步骤1:修改User模型,补充关联和密码重置邮箱获取方法
在app/Models/User.php中新增队长关联,同时重写Laravel密码重置系统默认调用的邮箱获取方法:
// 新增队长关联,直接通过关联获取当前用户对应队伍的leader角色参与者 public function leaderParticipant() { return $this->hasOneThrough(Participant::class, Team::class) ->where('participants.role', 'leader'); } // 重写密码重置邮箱获取方法 public function getEmailForPasswordReset() { if (!$this->leaderParticipant) { throw new \Exception('该账号未关联队长邮箱,无法重置密码'); } return $this->leaderParticipant->email; }
步骤2:重写忘记密码控制器的邮箱查询逻辑
Laravel默认会从users表查询邮箱,需要修改app/Http/Controllers/Auth/ForgotPasswordController.php中的查询逻辑,通过参与者表的队长邮箱反向查询对应的用户:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Password; public function sendResetLinkEmail(Request $request) { $request->validate(['email' => 'required|email']); // 根据输入的邮箱查询对应leader角色的用户 $user = User::whereHas('team.participants', function ($query) use ($request) { $query->where('email', $request->email) ->where('role', 'leader'); })->first(); if (!$user) { return back()->withErrors(['email' => trans(Password::INVALID_USER)]); } // 生成重置令牌并发送邮件 $token = app('auth.password.broker')->createToken($user); $user->sendPasswordResetNotification($token); return back()->with('status', trans(Password::RESET_LINK_SENT)); }
注意事项
- 如果存在同一个邮箱对应多个队伍leader的情况,需要自行补充冲突处理逻辑,比如在participants表给
email+role加唯一约束,或者查询到多个用户时返回对应错误提示 - 不需要修改默认的
password_resets表结构,系统会自动把leader的邮箱存入该表的email字段做校验
内容的提问来源于stack exchange,提问作者Crux
相关产品推荐
相关产品推荐

