例子:
打开 VerificationController
,此控制器处理所有邮件认证相关逻辑:
app/Http/Controllers/Auth/VerificationController.php
源码解析:
构建函数里使用了三个中间件,并且使用了中间件简称,这些简称是在 app/Http/Kernel.php
中的 $routeMiddleware
属性里做了定义,以下是三个中间件调用的解释:
设定了所有的控制器动作都需要登录后才能访问。
设定了 只有 verify
动作使用 signed
中间件进行认证, signed
中间件是一种由框架提供的很方便的 URL 签名认证方式,此中间件的更多说明请见 Laravel 5.6 新功能 —— 路由签名 。
对 verify
和 resend
动作做了频率限制,throttle
中间件是框架提供的访问频率限制功能,throttle
中间件会接收两个参数,这两个参数决定了在给定的分钟数内可以进行的最大请求数。 在这个例子中,我们限定了这两个动作访问频率是 1 分钟内不能超过 6 次。
控制器中:
use VerifiesEmails;
在 Laravel 的注册登录系统里面,一般都使用 PHP 的 Trait 机制来将提前设定好的功能注入到控制器里。在此控制器中,我们可以看到使用了 VerifiesEmails
Trait ,打开此文件查看源码:
vendor/laravel/framework/src/Illuminate/Foundation/Auth/VerifiesEmails.php
请注意看 verify
方法里这一段:
如果用户能够成功设置为已认证的话,触发事件 Verified
并将用户传参。这里使用了 Laravel 的事件系统。
Laravel 事件是一套简单的观察者实现,能够订阅和监听应用中发生的各种事件。事件系统为应用各个方面的解耦提供了非常棒的解决方案,因为单个事件可以拥有多个互不依赖的监听器。
在我们这个场景中,用户认证成功后触发了 Verified
事件,我们对其进行监听即可加入我们想要的逻辑。此时也许有同学要问,为何不直接修改 vendor/laravel/framework/src/Illuminate/Foundation/Auth/VerifiesEmails.php
文件即可?因为此文件是 Laravel 框架自带的,本地修改后,无法纳入版本控制系统里,也无法同步到线上或者其他环境。所以正确的方式,是对 Verified
事件进行监听。
应用的事件监听需要在 EventServiceProvider
里注册:
app/Providers/EventServiceProvider.php
这种键值对应的写法,可以让单个事件对应多个监听器,这里我们的事件是 IlluminateAuthEventsVerified
,监听器是 AppListenersEmailVerified
。Listeners
文件夹是约定俗成的监听器命名,接下来我们使用命令行来生成此监听器:
php artisan event:generate
以上命令会为我们生成 app/Listeners/EmailVerified.php
文件,稍作修改:
事件监听器已经部署好,接下来我们测试一下
用户点击认证链接进入网站,如果认证成功,即可看到提示