当前位置: 首页 > 后端技术 > PHP

Laravel用户发邮件重置密码

时间:2023-03-29 17:30:17 PHP

Laravel5.3重设密码由于需要发邮件重设密码,而laravel默认使用国外驱动,所以需要改成国内驱动。使用sendcloud第一步:忘记密码,首先看到的是App\Http\Controllers\Auth\ForgotPasswordController.php的代码使用SendsPasswordResetEmails;//使用这个特性来显示和发送邮件/***创建一个新的控制器实例。**@returnvoid*/publicfunction__construct(){$this->middleware('guest');看到这么干净,好像只能在SendsPasswordResetEmails的第二部分:发送邮件,进行下一步。我们知道使用了一个SendsPasswordResetEmailstrait,里面有两个重要的方法://DisplayviewpublicfunctionshowLinkRequestForm(){returnview('auth.passwords.email');}publicfunctionsendResetLinkEmail(Request$request){//验证邮箱地址是否有效$this->validate($request,['email'=>'required|email']);//发送邮件sendResetLink是PasswordBroker中的一个方法$response=$this->broker()->sendResetLink($request->only('email'));//返回状态根据发送邮件返回对应返回$response==Password::RESET_LINK_SENT?$this->sendResetLinkResponse($response):$this->sendResetLinkFailedResponse($request,$response);}/***获取密码重置期间要使用的代理。**@return\Illuminate\Contracts\Auth\PasswordBroker看看这个返回值*/publicfunctionbroker(){returnPassword::broker();}可以看到\Illuminate\Contracts\Auth\PasswordBroker的接口实例是Illuminate\Auth\在PasswordsPasswordBroker.php文件中,找到上面用来发送邮件的一个方法sendResetLink,如下publicfunctionsendResetLink(array$credentials){//查找用户信息$user=$this->getUser($credentials);如果(is_null($user)){返回静态::INVALID_USER;}//真正发送邮件的地方,找到了User.php中调用的方法$user->sendPasswordResetNotification($this->tokens->create($user));返回静态::RESET_LINK_SENT;}步骤3:用户数据模型在上一步中,我看到User.php模型中的sendPasswordResetNotification方法用于发送电子邮件。我发现没有这样的方法。我看到了Authenticatable的继承。进去看看:发现重要消息,这个地方用到了一个traitCanResetPassword,看代码://找到第二步调用的方法publicfunctionsendPasswordResetNotification($token){$this->notify(newResetPasswordNotification($token));//notify和什么鬼,我还没注意到}查看ResetPasswordNotification,发现有一个发送邮件的方法:publicfunctiontoMail($notifiable){return(newMailMessage)->line('您收到这封电子邮件是因为我们收到了您帐户的密码重置请求。')->action('重置密码',url('password/reset',$this->token))->line('如果您没有请求重设密码,则无需采取进一步行动。');}//url('password/reset',$this->token))这个在重写的时候用到。从这个角度来看,如果我们在U??ser.php中重现这个方法,我们应该可以重写laravel默认发送邮件的方式是publicfunctionsendPasswordResetNotification($token){//templatevariable$data=['url'=>url('password/reset',$token),//这个地址是Illuminate\Auth\Notifications\ResetPassword中toMail方法中的url,复制即可'name'=>$this->name,];$template=newSendCloudTemplate('zhihu_app_register',$data);Mail::raw($template,function($message){$message->from('xxxx@qq.com','xxxx');$message->to($this->email);});}}这样,我们就改变了默认的重置密码和发送邮件的方式。还有很多细节,有时间再挖掘,编织爱