laravel 用户发送邮件重置密码

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值