博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
laravel 用户发送邮件重置密码
阅读量:5772 次
发布时间:2019-06-18

本文共 3284 字,大约阅读时间需要 10 分钟。

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

转载地址:http://azoux.baihongyu.com/

你可能感兴趣的文章
libgdx 3D Bullet 碰撞检测二
查看>>
AD原理图统一命名
查看>>
Head First--设计模式 单件模式 独一无二的对象
查看>>
程序一
查看>>
记录的重要性
查看>>
团队-象棋游戏-代码设计规范
查看>>
Windows 服务器配置、运行、图文流程(新手必备!) - IIS建站配置一条龙
查看>>
About Me
查看>>
Linux-grep命令
查看>>
一秒去除Win7快捷方式箭头
查看>>
Oracle序列使用:建立、删除
查看>>
html5 渐变按钮练习
查看>>
ES8 (2017)新特性
查看>>
由创建文件想起的。。。
查看>>
数据字典生成工具之旅(2):数据字典生成工具及文档工具作用介绍
查看>>
asp.net(C#)去除html格式
查看>>
构建之法读后感part1
查看>>
Linux内存管理(二)
查看>>
duilib+cef自定义浏览器控件编译错误
查看>>
PF_RING 总结
查看>>