谢邀,^____^。
在 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));
}
}
谢邀,^____^。
在 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));
}
}
我觉得其实还是作者的方法更好一点
- 修改密码提示和前面的认证提示不是一样,认证提示是认证确认后,事件 verified的,只有成功一种可能。而修改密码是分成功和不成功的,事件都是PasswordReset。
- 其次,重写trait并不影响Laravel核心代码,前面章节用事件也是为了不影响核心代码。
- 可以帮助大家复习一下 trait的用法,即 Class member > trait > inherit
@bibace 重写父类或者 trait 中的方法只是 php 中的基本知识点。你不觉得用事件后应用拓展性更强、逻辑更清晰?例如,应用还想实现邮件通知用户密码已更改的功能,我们往重写的方法中添加逻辑,会导致方法臃肿不堪,也破坏了 solid 设计原则。
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事件,因为这个事件发生以后,用户就会登录。
我刚接触laravel,甚至php,对重写trait方法比较陌生,通过这一节既了解了重写trait方法,看了您的提问也颇受启发,仿照上一节利用事件实现。对于小白,这个教程很友好,在像您等高水平的学习者的提问里,我也受益匪浅,感谢大家为社区做出的贡献
搞不懂,为什么就返回一个 ,密码重置成功也要做的这么麻烦, 这样对新手是不是太不友好了? 都搞不懂他们的关系,其实我发现不用重写 sendResetResponse() 方法也可以得到提示, 就是在原有的 sendResetResponse 方法上 写上 :
protected function sendResetResponse(Request $request, $response)
{
session()->flash('success', '密码更新成功,您已成功登录!');
return redirect($this->redirectPath())
->with('status', trans($response));
}
就是这里写上 提示修改成功, 一样可以得到大家想要的, 大家怎么看?
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!');
}
事件确实处理是最好的方式,比如后期业务有变化,不使用session暂存改为发送邮件也是有可能的,慢慢对事件监听器了解一下了。我这里贴出我创建的监听器
1.使用命令创建监听器文件 php artisan make:listener ResetPassword
2.事件和监听器进行绑定
// EventServiceProvider
// 密码重置
PasswordReset::class =>[
ResetPassword::class,
],
- 编写监听器中的handel方法
public function handle($event) { session()->flash('success','密码重置成功!'); }
- 密码重置事件只有在密码重置成功后才会触发,所以在监听器中不需要验证密码重置成功没有
@softer 后期就密码被修改了就给用户发送一封密码被修改成功的风险通知邮件 这样的逻辑很常见 我也觉得事件的写法标准 作者应该是为了将 重载的方法 可以不改框架就 修改逻辑
我这里就改了密码长度验证规则
一样的重载
推荐文章: