Laravel 5.6升级至8.0后重置密码功能失效,如何获取缺失文件?
Laravel 5.6升级至8.0后密码重置功能修复方案
问题概述
升级后密码重置功能失效,具体表现为:
- 路由指向
ResetPasswordController@reset,但控制器无此方法 - 控制器引用的
Illuminate\Foundation\Auth\ResetsPasswordstrait不存在 - 担心全局更新影响现有功能,希望针对性修复
现有代码
路由配置
Route::group(['prefix' => 'app'], function () { //Auth::routes(); Route::get('login', ['as' => 'app.login', 'uses' => 'App\Auth\LoginController@showLoginForm']); Route::post('login', ['as' => 'app.login.post', 'uses' => 'App\Auth\LoginController@login']); Route::post('logout', ['as' => 'app.logout.post', 'uses' => 'App\Auth\LoginController@logout']); Route::post('password/email', ['as' => 'app.password.email.post', 'uses' => 'App\Auth\ForgotPasswordController@sendResetLinkEmail']); Route::get('password/reset', ['as' => 'app.password', 'uses' => 'App\Auth\ForgotPasswordController@showLinkRequestForm']); Route::get('password/reset/{token}', ['as' => 'app.password.reset', 'uses' => 'App\Auth\ResetPasswordController@showResetForm']); Route::post('password/reset/{token}', ['as' => 'app.password.reset.post', 'uses' => 'App\Auth\ResetPasswordController@reset']); });
ResetPasswordController代码
namespace App\Http\Controllers\App\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Foundation\Auth\ResetsPasswords; class ResetPasswordController extends Controller { use ResetsPasswords; protected $redirectTo = '/'; public function __construct() { $this->redirectTo = route('app.dashboard'); $this->middleware('guest'); } public function showResetForm(Request $request, $token = null) { return view('app.auth.passwords.reset')->with( ['token' => $token, 'email' => $request->email] ); } }
修复步骤
1. 安装适配Laravel 8的laravel/ui包
Laravel 8已将Auth相关的trait及逻辑迁移至laravel/ui包,执行以下命令安装对应版本(仅引入依赖,不覆盖现有代码):
composer require laravel/ui:^3.0
2. 修正trait引用命名空间
修改ResetPasswordController中的trait引入路径:
// 移除旧引用 // use Illuminate\Foundation\Auth\ResetsPasswords; // 添加新引用 use Illuminate\Auth\Passwords\ResetsPasswords;
若ForgotPasswordController存在类似问题,需同步更新其trait引用。
3. 适配路由与控制器方法
Laravel 8的ResetsPasswords trait中,reset方法仅接收Request参数,无需在路由中传递{token},调整路由配置:
// 替换原有post路由 // Route::post('password/reset/{token}', ['as' => 'app.password.reset.post', 'uses' => 'App\Auth\ResetPasswordController@reset']); // 修改为 Route::post('password/reset', ['as' => 'app.password.reset.post', 'uses' => 'App\Auth\ResetPasswordController@reset']);
trait会自动从请求中获取token参数,无需在路由中定义。
4. 更新reset.blade.php视图
确保视图包含必填字段,且表单提交至正确路由(保留原有UI样式,仅调整结构):
<form method="POST" action="{{ route('app.password.reset.post') }}"> @csrf <input type="hidden" name="token" value="{{ $token }}"> <div> <label for="email">邮箱</label> <input type="email" name="email" id="email" value="{{ $email ?? old('email') }}" required autofocus> </div> <div> <label for="password">新密码</label> <input type="password" name="password" id="password" required> </div> <div> <label for="password_confirmation">确认密码</label> <input type="password" name="password_confirmation" id="password_confirmation" required> </div> <button type="submit">重置密码</button> </form>
5. 验证功能
清除缓存并测试密码重置流程:
php artisan cache:clear php artisan route:clear
内容的提问来源于stack exchange,提问作者David Newey
相关产品推荐
相关产品推荐

