laravel 事件系统

 例子:

打开 VerificationController ,此控制器处理所有邮件认证相关逻辑:

app/Http/Controllers/Auth/VerificationController.php

laravel 事件系统

源码解析:

构建函数里使用了三个中间件,并且使用了中间件简称,这些简称是在 app/Http/Kernel.php 中的 $routeMiddleware 属性里做了定义,以下是三个中间件调用的解释:

laravel 事件系统

设定了所有的控制器动作都需要登录后才能访问。

laravel 事件系统

设定了 只有 verify 动作使用 signed 中间件进行认证, signed 中间件是一种由框架提供的很方便的 URL 签名认证方式,此中间件的更多说明请见 Laravel 5.6 新功能 —— 路由签名 。

laravel 事件系统

对 verify 和 resend 动作做了频率限制,throttle 中间件是框架提供的访问频率限制功能,throttle 中间件会接收两个参数,这两个参数决定了在给定的分钟数内可以进行的最大请求数。 在这个例子中,我们限定了这两个动作访问频率是 1 分钟内不能超过 6 次。

控制器中:

use VerifiesEmails;

在 Laravel 的注册登录系统里面,一般都使用 PHP 的 Trait 机制来将提前设定好的功能注入到控制器里。在此控制器中,我们可以看到使用了 VerifiesEmails Trait ,打开此文件查看源码:

vendor/laravel/framework/src/Illuminate/Foundation/Auth/VerifiesEmails.php

laravel 事件系统

请注意看 verify 方法里这一段:

laravel 事件系统

如果用户能够成功设置为已认证的话,触发事件 Verified 并将用户传参。这里使用了 Laravel 的事件系统。

Laravel 事件是一套简单的观察者实现,能够订阅和监听应用中发生的各种事件。事件系统为应用各个方面的解耦提供了非常棒的解决方案,因为单个事件可以拥有多个互不依赖的监听器。

在我们这个场景中,用户认证成功后触发了 Verified 事件,我们对其进行监听即可加入我们想要的逻辑。此时也许有同学要问,为何不直接修改 vendor/laravel/framework/src/Illuminate/Foundation/Auth/VerifiesEmails.php 文件即可?因为此文件是 Laravel 框架自带的,本地修改后,无法纳入版本控制系统里,也无法同步到线上或者其他环境。所以正确的方式,是对 Verified 事件进行监听。

应用的事件监听需要在 EventServiceProvider 里注册:

app/Providers/EventServiceProvider.php

laravel 事件系统

这种键值对应的写法,可以让单个事件对应多个监听器,这里我们的事件是 IlluminateAuthEventsVerified ,监听器是 AppListenersEmailVerified 。Listeners 文件夹是约定俗成的监听器命名,接下来我们使用命令行来生成此监听器:

php artisan event:generate

以上命令会为我们生成 app/Listeners/EmailVerified.php 文件,稍作修改:

laravel 事件系统

事件监听器已经部署好,接下来我们测试一下

用户点击认证链接进入网站,如果认证成功,即可看到提示

laravel 事件系统