You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.6升级至8.0后重置密码功能失效,如何获取缺失文件?

Laravel 5.6升级至8.0后密码重置功能修复方案

问题概述

升级后密码重置功能失效,具体表现为:

  • 路由指向ResetPasswordController@reset,但控制器无此方法
  • 控制器引用的Illuminate\Foundation\Auth\ResetsPasswords trait不存在
  • 担心全局更新影响现有功能,希望针对性修复

现有代码

路由配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:05:26