Laravel密码修改失败:控制器接收请求但无法保存新密码求助
Laravel密码修改无法保存问题修复
问题概述
我基于Laravel编写了密码修改控制器函数,逻辑为验证旧密码与系统存储密码匹配后替换为新密码。已通过dd($request)确认控制器能接收请求,但新密码始终无法保存,相关代码如下:
控制器代码
public function update_password (Request $request) { // dd($request); $request->validate([ 'oldpassword' => ['required','string','min:8'], 'newpassword' => ['required', 'string', 'min:8', 'confirmed'] ]); $currentPasswordStatus = Hash::check($request->oldpassword, auth()->user()->password); if($currentPasswordStatus){ User::findOrFail(Auth::user()->id)->update([ 'password' => Hash::make($request->newpassword), ]); dd($request->password); return redirect()->route('profile')->with('message','Password Updated Successfully'); }else{ return redirect()->back()->with('message','Current Password does not match with Old Password'); } }
路由配置
Route::post('update_password', [\App\Http\Controllers\Auth\RegisteredUserController::class, 'update_password'])->name('change_password'); Route::get('update_password',[\App\Http\Controllers\Auth\RegisteredUserController::class, 'edit_password'])->name('edit_password');
表单代码
<div class="row g-7"> <form class="box" style="top: 50rem" method="POST" action="{{ route('change_password') }}"> @csrf <div> <label class="font-italic mb-1" style="padding: 1rem">Enter Old Password:</label> <span><input id="password" class="block mt-1 w-full" type="password" name="oldpassword" required /></span> </div> <div> <label class="font-italic mb-1" style="padding: 1rem">Enter New Password:</label> <span><input id="password" class="block mt-1 w-full" type="password" name="newpassword" required /></span> </div> <div> <label class="font-italic mb-1" style="padding: 1rem">Confirm New Password:</label> <span><input id="password" class="block mt-1 w-full" type="password" name="confirm" required /></span> </div> <div class="button"> <button type="submit" class="btn btn-danger text-uppercase mr-2 px-4">reset</button> </div> </form> </div>
问题排查
- 验证规则与表单字段不匹配:控制器中
newpassword字段使用了confirmed验证规则,该规则要求确认密码字段的name必须为newpassword_confirmation,但表单里确认密码的name是confirm,导致验证失败,后续更新代码根本未执行。 - 多余的终止代码:更新密码后执行的
dd($request->password);会直接终止程序,且$request->password不存在(表单无对应字段),导致成功跳转逻辑无法触发,也无法看到更新成功提示。 - 表单input的id重复:所有密码输入框的
id都设为password,虽不影响功能,但不符合HTML规范,易引发混淆。
修复步骤
1. 修正表单确认密码字段
将确认密码的name改为newpassword_confirmation,同时修正对应id:
<div> <label class="font-italic mb-1" style="padding: 1rem">Confirm New Password:</label> <span><input id="newpassword_confirmation" class="block mt-1 w-full" type="password" name="newpassword_confirmation" required /></span> </div>
2. 优化控制器代码
移除多余的dd代码,同时简化用户更新逻辑(直接使用auth()->user()无需重复查询):
public function update_password(Request $request) { $request->validate([ 'oldpassword' => ['required','string','min:8'], 'newpassword' => ['required', 'string', 'min:8', 'confirmed'] ]); $currentPasswordStatus = Hash::check($request->oldpassword, auth()->user()->password); if($currentPasswordStatus){ auth()->user()->update([ 'password' => Hash::make($request->newpassword) ]); return redirect()->route('profile')->with('message','Password Updated Successfully'); }else{ return redirect()->back()->with('message','Current Password does not match with Old Password'); } }
3. 可选:添加表单错误提示
在表单中加入验证错误显示,方便快速排查问题:
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
内容的提问来源于stack exchange,提问作者Divine SCONTY
相关产品推荐
相关产品推荐

