利用事件来提醒用户密码已经重置不是更好

resetPassword() 会触发 “PasswordReset” 事件,新建一个监听者(包含提醒用户已重置密码的逻辑)监听这个事件。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 15

谢邀,^____^
在 EventServiceProvider 中注册 PasswordRest 的监听者。

class EventServiceProvider extends ServiceProvider
{

   protected $listen = [
      .
      .
      .
       PasswordReset::class => [
           \App\Listeners\ResetPassword::class,
       ],
   ];
     .
     .
     .
   }

运行 php artisan make:event,在新生成的 App\Listeners\ResetPassword 上编写逻辑:

<?php

namespace App\Listeners;

use App\Http\Controllers\Auth\ResetPasswordController;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Password;

class ResetPassword
{
   .
   .
   .
   public function handle(PasswordReset $event)
   {
      $response = property_exists(Password::class, 'PASSWORD_RESET') ? 
           Password::PASSWORD_RESET : 'Your password has been reset!';
       session()->flash('success', trans($response));
   }
}
5年前 评论
rabbit_wl 3年前
kakaxi 3年前

我刚接触laravel,甚至php,对重写trait方法比较陌生,通过这一节既了解了重写trait方法,看了您的提问也颇受启发,仿照上一节利用事件实现。对于小白,这个教程很友好,在像您等高水平的学习者的提问里,我也受益匪浅,感谢大家为社区做出的贡献

4年前 评论
myvsmyx

写出你的代码

5年前 评论

谢邀,^____^
在 EventServiceProvider 中注册 PasswordRest 的监听者。

class EventServiceProvider extends ServiceProvider
{

   protected $listen = [
      .
      .
      .
       PasswordReset::class => [
           \App\Listeners\ResetPassword::class,
       ],
   ];
     .
     .
     .
   }

运行 php artisan make:event,在新生成的 App\Listeners\ResetPassword 上编写逻辑:

<?php

namespace App\Listeners;

use App\Http\Controllers\Auth\ResetPasswordController;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Password;

class ResetPassword
{
   .
   .
   .
   public function handle(PasswordReset $event)
   {
      $response = property_exists(Password::class, 'PASSWORD_RESET') ? 
           Password::PASSWORD_RESET : 'Your password has been reset!';
       session()->flash('success', trans($response));
   }
}
5年前 评论
rabbit_wl 3年前
kakaxi 3年前

:+1:,作者可能是多提供一种方案吧,不过我也觉得事件会清晰

5年前 评论

我觉得其实还是作者的方法更好一点

  1. 修改密码提示和前面的认证提示不是一样,认证提示是认证确认后,事件 verified的,只有成功一种可能。而修改密码是分成功和不成功的,事件都是PasswordReset。
  2. 其次,重写trait并不影响Laravel核心代码,前面章节用事件也是为了不影响核心代码。
  3. 可以帮助大家复习一下 trait的用法,即 Class member > trait > inherit
4年前 评论
Apress

这个是教程,不一定是最优方案,前面已经用过事件了,这里再用事件,知识点就重复了。所以换一种。个人见解

4年前 评论

@bibace 重写父类或者 trait 中的方法只是 php 中的基本知识点。你不觉得用事件后应用拓展性更强、逻辑更清晰?例如,应用还想实现邮件通知用户密码已更改的功能,我们往重写的方法中添加逻辑,会导致方法臃肿不堪,也破坏了 solid 设计原则。

4年前 评论
protected function resetPassword($user, $password)
{
    $user->password = Hash::make($password);

    $user->setRememberToken(Str::random(60));

    $user->save();

    event(new PasswordReset($user));

    $this->guard()->login($user);
}

@bibace 只有密码成功修改以后才会触发Password::Reset事件,因为这个事件发生以后,用户就会登录。

4年前 评论

我刚接触laravel,甚至php,对重写trait方法比较陌生,通过这一节既了解了重写trait方法,看了您的提问也颇受启发,仿照上一节利用事件实现。对于小白,这个教程很友好,在像您等高水平的学习者的提问里,我也受益匪浅,感谢大家为社区做出的贡献

4年前 评论

搞不懂,为什么就返回一个 ,密码重置成功也要做的这么麻烦, 这样对新手是不是太不友好了? 都搞不懂他们的关系,其实我发现不用重写 sendResetResponse() 方法也可以得到提示, 就是在原有的 sendResetResponse 方法上 写上 :
protected function sendResetResponse(Request $request, $response)
{
session()->flash('success', '密码更新成功,您已成功登录!');
return redirect($this->redirectPath())
->with('status', trans($response));
}

就是这里写上 提示修改成功, 一样可以得到大家想要的, 大家怎么看?

4年前 评论
bibace 4年前

为什么 我运行你的那个 命令就没有 生成文件呢?
php artisan make:event ??? 没有

4年前 评论

@jxdr 需要先在EventServiceProvider中写出,要生成的EventListener

4年前 评论
public function handle(PasswordReset $event)
   {
      $response = property_exists(Password::class, 'PASSWORD_RESET') ? 
           Password::PASSWORD_RESET : 'Your password has been reset!';
       session()->flash('success', trans($response));
   }

其实可以简化为

public function handle(PasswordReset $event)
   {
       session()->flash('success', 'Your password has been reset!');
   }
4年前 评论

您这种方法确实更好一些,学到了! :+1:

4年前 评论

事件确实处理是最好的方式,比如后期业务有变化,不使用session暂存改为发送邮件也是有可能的,慢慢对事件监听器了解一下了。我这里贴出我创建的监听器

1.使用命令创建监听器文件 php artisan make:listener ResetPassword

2.事件和监听器进行绑定

// EventServiceProvider
 // 密码重置
 PasswordReset::class =>[
          ResetPassword::class,
   ],
  1. 编写监听器中的handel方法
    public function handle($event)
     {
         session()->flash('success','密码重置成功!');
     }
  2. 密码重置事件只有在密码重置成功后才会触发,所以在监听器中不需要验证密码重置成功没有
3年前 评论

@softer 后期就密码被修改了就给用户发送一封密码被修改成功的风险通知邮件 这样的逻辑很常见 我也觉得事件的写法标准 作者应该是为了将 重载的方法 可以不改框架就 修改逻辑
我这里就改了密码长度验证规则

file

一样的重载

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!