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

Laravel 6:如何重写sendPasswordResetNotification方法以使用自定义密码重置通知(避免修改vendor文件)

如何在Laravel中重写密码重置通知而不修改Vendor文件

没问题,这是Laravel开发中很常见的需求——直接修改vendor文件确实会在composer install时被覆盖,正确的做法是利用PHP Trait的方法覆盖特性,在你自己的用户模型中重写sendPasswordResetNotification方法即可。

步骤1:在User模型中重写通知方法

找到你的认证模型(通常是app/Models/User.php),确保它已经引入了CanResetPassword Trait,然后直接添加同名方法来覆盖Trait中的实现:

// app/Models/User.php
namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Auth\Passwords\CanResetPassword;
use App\Notifications\CustomResetPassword; // 引入你的自定义通知类

class User extends Authenticatable
{
    use Notifiable, CanResetPassword;

    // 重写CanResetPassword Trait中的方法
    public function sendPasswordResetNotification($token)
    {
        // 调用你的自定义通知类
        $this->notify(new CustomResetPassword($token));
    }
}

步骤2:创建自定义密码重置通知类

如果还没有CustomResetPassword类,在app/Notifications目录下创建它,自定义你的重置链接和邮件内容:

// app/Notifications/CustomResetPassword.php
namespace App\Notifications;

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

class CustomResetPassword extends Notification
{
    protected $token;

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

    // 指定通知渠道,这里用邮件
    public function via($notifiable)
    {
        return ['mail'];
    }

    // 构建邮件内容,完全自定义你的重置链接和文案
    public function toMail($notifiable)
    {
        $resetUrl = url("/password/reset/{$this->token}?email={$notifiable->getEmailForPasswordReset()}");

        return (new MailMessage)
            ->subject('自定义密码重置邮件')
            ->line('你收到这封邮件是因为我们收到了你的账户密码重置请求')
            ->action('立即重置密码', $resetUrl)
            ->line('如果不是你发起的请求,请忽略此邮件');
    }
}

步骤3:保留现有密码重置逻辑

你之前在服务类中的密码重置代码不需要修改,因为Password::reset()方法会自动调用用户模型中重写后的sendPasswordResetNotification方法,现在会触发你的自定义通知:

$reset_password_status = Password::reset($credentials, function ($user, $password) {
    $user->password = $password;
    $user->save();
});
if ($reset_password_status == Password::INVALID_TOKEN) {
    return $this->returnError->error("Invalid token provided");
}

原理说明

PHP中,当类和它使用的Trait拥有同名方法时,类的方法会优先于Trait的方法执行,所以我们在User模型中定义的sendPasswordResetNotification会覆盖CanResetPassword Trait中的原方法,完全不需要修改vendor目录下的文件,这样就避免了composer install覆盖修改的问题。

内容的提问来源于stack exchange,提问作者PHP User

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:32:47