Laravel 事件系统
Laravel 事件是一套简单的观察者实现,能够订阅和监听应用中发生的各种事件。事件系统为应用各个方面的解耦提供了非常棒的解决方案,因为单个事件可以拥有多个互不依赖的监听器。
在我们这个场景中,用户认证成功后触发了 Verified 事件,我们对其进行监听即可加入我们想要的逻辑。为何不直接修改 vendor/laravel/framework/src/Illuminate/Foundation/Auth/VerifiesEmails.php 文件即可?因为此文件是 Laravel 框架自带的,本地修改后,无法纳入版本控制系统里,也无法同步到线上或者其他环境。所以正确的方式,是对 Verified 事件进行监听。
应用的事件监听需要在 EventServiceProvider 里注册:
app/Providers/EventServiceProvider.php
/**
* 应用程序的事件监听器
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Verified' => [
'App\Listeners\LogVerifiedUser',
],
];
这种键值对应的写法,可以让单个事件对应多个监听器,这里我们的事件是 Illuminate\Auth\Events\Verified ,监听器是 App\Listeners\EmailVerified 。 Listeners 文件夹是约定俗成的监听器命名,接下来我们使用命令行来生成此监听器:
php artisan event:generate
以上命令会为我们生成 app/Listeners/EmailVerified.php 文件,稍作修改:
/**
* Handle the event.
*
* @param Verified $event
* @return void
*/
public function handle(Verified $event)
{
// 会话里闪存认证成功后的消息提醒
session()->flash('success', '邮箱验证成功 ^_^');
}
开始测试
为了测试方便,我们先手工更改数据,将用户还原到注册成功后的状态。打开数据库客户端,定位到当前登录用户,修改email_verified_at 字段为 NULL :
刷新页面会跳转至认证提醒页:
点击『点击重新发送 E-mail.』链接发送认证邮件:
打开 storage/logs 里的今日对应的 Log,定位到文件最尾端,取出验证链接。切换到浏览器测试下:
现在用户点击认证链接进入网站,如果认证成功,即可看到提示。