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

Laravel5.5修改密码重置邮件模板及路由适配查询参数问题

我来帮你解决Laravel 5.5密码重置的这两个问题,一步步来:


一、重写路由以支持查询参数形式的重置链接

你的邮件链接是通过查询参数传递token(?token=xxx),但默认Laravel路由是用路径参数(password/reset/{token})来接收的。我们只需要调整控制器逻辑,让它同时兼容两种传参方式即可:

1. 修改ResetPasswordController的showResetForm方法

打开app/Http/Controllers/Auth/ResetPasswordController.php,更新方法代码,让它优先读取路径参数,没有的话再从查询参数里取token:

use Illuminate\Http\Request;

public function showResetForm(Request $request, $token = null)
{
    // 兼容路径参数和查询参数的token
    $token = $token ?? $request->query('token');
    // 同时可以获取邮件里附带的email参数(可选)
    $email = $request->query('email');

    return view('auth.passwords.reset')->with([
        'token' => $token,
        'email' => $email
    ]);
}

2. 调整路由(可选,保持兼容性)

如果你想让password/reset这个路由也能处理带查询参数的请求,可以把原来的路由改成可选参数形式,这样两种链接格式都能匹配:

// 显示密码重置请求表单(不变)
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.email');

// 同时支持路径参数和查询参数的重置表单路由
Route::get('password/reset/{token?}', 'Auth\ResetPasswordController@showResetForm')->name('password.request');

这样不管是http://localhost/administrator/password/reset/xxx还是你收到的http://localhost/administrator/password/reset?token=xxx,都能正常跳转到密码重置页面。


二、修改密码重置邮件模板

Laravel默认的密码重置通知在vendor目录里,不能直接修改,我们需要自定义通知类来替换默认逻辑:

1. 创建自定义密码重置通知类

运行Artisan命令生成一个新的通知类:

php artisan make:notification ResetPassword

打开生成的app/Notifications/ResetPassword.php,替换内容为以下代码(你可以完全自定义邮件的标题、正文和按钮):

namespace App\Notifications;

use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class ResetPassword extends Notification
{
    public $token;

    public function __construct($token)
    {
        $this->token = $token;
    }

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        // 这里可以自由修改邮件的所有内容
        return (new MailMessage)
            ->subject('账号密码重置请求')
            ->line('你收到这封邮件是因为我们收到了你账号的密码重置申请。')
            ->action('立即重置密码', url(config('app.url').route('password.request', [
                'token' => $this->token,
                'email' => $notifiable->getEmailForPasswordReset()
            ], false)))
            ->line('如果不是你本人操作,请忽略此邮件,你的账号不会受到影响。');
    }
}

2. 让User模型使用自定义通知

打开app/User.php,添加use语句并重写sendPasswordResetNotification方法,指定用我们自定义的通知类发送邮件:

use App\Notifications\ResetPassword as ResetPasswordNotification;

public function sendPasswordResetNotification($token)
{
    $this->notify(new ResetPasswordNotification($token));
}

3. (进阶)使用完全自定义的HTML邮件视图

如果你想自己写邮件的HTML结构,可以创建视图文件resources/views/emails/password/reset.blade.php,然后修改toMail方法:

public function toMail($notifiable)
{
    $resetUrl = url(config('app.url').route('password.request', [
        'token' => $this->token,
        'email' => $notifiable->getEmailForPasswordReset()
    ], false));

    return (new MailMessage)
        ->subject('密码重置请求')
        ->view('emails.password.reset', [
            'resetUrl' => $resetUrl,
            'user' => $notifiable
        ]);
}

然后在视图文件里写你想要的HTML结构,比如:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>密码重置</title>
</head>
<body>
    <div style="max-width: 600px; margin: 0 auto; padding: 20px;">
        <h2>您好 {{ $user->name }},</h2>
        <p>请点击下面的链接重置您的密码:</p>
        <a href="{{ $resetUrl }}" style="display: inline-block; padding: 10px 20px; background: #3490dc; color: white; text-decoration: none; border-radius: 4px;">重置密码</a>
        <p>如果您没有发起此请求,请忽略此邮件。</p>
    </div>
</body>
</html>

内容的提问来源于stack exchange,提问作者Niladri Banerjee - Uttarpara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:14:54