laravel5.3 重置密码
由于重置密码需要发送邮件,而laravel默认使用国外的驱动,所以需要改成国内的驱动,使用sendcloud
第一步:忘记密码
首先看到的是App\Http\Controllers\Auth\ForgotPasswordController.php
的代码
use SendsPasswordResetEmails; //使用这个trait显示发送邮件,和发送邮件 /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest'); }
看到是如此干净,看来只有可能在SendsPasswordResetEmails
第二部:发送邮件
再上一步我们知道,用到了一个SendsPasswordResetEmails
trait,里面有两个重要的方法:
//显示视图 public function showLinkRequestForm() { return view('auth.passwords.email'); } public function sendResetLinkEmail(Request $request) { //验证邮箱地址是否有效 $this->validate($request, ['email' => 'required|email']); //发送邮件 sendResetLink是PasswordBroker 里面的一个方法 $response = $this->broker()->sendResetLink( $request->only('email') ); //根据发送邮件返回状态 返回相应 return $response == Password::RESET_LINK_SENT ? $this->sendResetLinkResponse($response) : $this->sendResetLinkFailedResponse($request, $response); } /** * Get the broker to be used during password reset. * * @return \Illuminate\Contracts\Auth\PasswordBroker 看这个返回值 */ public function broker() { return Password::broker(); }
可以看到\Illuminate\Contracts\Auth\PasswordBroker
这个接口实例是Illuminate\Auth\PasswordsPasswordBroker.php
这个文件,找到上面发送邮件使用的一个方法sendResetLink
,如下
public function sendResetLink(array $credentials) { //查找用户信息 $user = $this->getUser($credentials); if (is_null($user)) { return static::INVALID_USER; } //真正发送邮件的地方,发现调用的User.php 里的方法 $user->sendPasswordResetNotification( $this->tokens->create($user) ); return static::RESET_LINK_SENT; }
第三步:用户数据模型
上一步看到发送邮件使用的是User.php
这个model 里的 sendPasswordResetNotification
方法
发现并没有这个方法,看到继承Authenticatable
,进去看看:
发现了重大新闻,这个地方用了个trait CanResetPassword
,看下代码:
//找到第二步中调用的方法了 public function sendPasswordResetNotification($token) { $this->notify(new ResetPasswordNotification($token));//notify 又是什么鬼,暂时没有注意到 }
看下ResetPasswordNotification
,发现有个发送邮件的方法:
public function toMail($notifiable) { return (new MailMessage) ->line('You are receiving this email because we received a password reset request for your account.') ->action('Reset Password', url('password/reset', $this->token)) ->line('If you did not request a password reset, no further action is required.'); } // url('password/reset', $this->token)) 这个重写的时候用的上
这样看来,我们重现一下User.php
中的这个方法就应该可以改写laravel
默认发送邮件的方式了
public function sendPasswordResetNotification($token) { // 模板变量 $data = [ 'url' => url('password/reset', $token), //这个地址是Illuminate\Auth\Notifications\ResetPassword 中方法toMail 里的url,复制过来就可以 'name'=>$this->name, ]; $template = new SendCloudTemplate( 'zhihu_app_register', $data ); Mail::raw( $template, function ( $message ) { $message->from( 'xxxx@qq.com', 'xxxx' ); $message->to( $this->email ); } ); }}
这样我们就改了默认重置密码发送邮件的方法了
还有很多细节,等有空再去细抠,weaving love