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
相关产品推荐
相关产品推荐

