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

