例子:

打开 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

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

php artisan event:generate

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

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

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



laravel 事件系统的更多相关文章

  1. Laravel 事件系统用法总结(监听事件,观察者模式)

    看这篇文章先复习一下设计模式 : https://www.cnblogs.com/fps2tao/p/9640338.html 在理解了观察者模式后,我们开始正文 Laravel 的事件提供了一个简单 ...

  2. laravel Event执行顺序

    laravel一大特色就是event事件系统.一般首先要listen一个事件,随后fire那个事件,这时执行路径将会调用event handler,返回后继续执行.例如: Event::listen( ...

  3. laravel源码解析

    本专栏系列文章已经收录到 GitBooklaravel源码解析 Laravel Passport——OAuth2 API 认证系统源码解析(下)laravel源码解析 Laravel Passport ...

  4. Laravel 即时应用的一种实现方式

    即时交互的应用 在现代的 Web 应用中很多场景都需要运用到即时通讯,比如说最常见的支付回调,与三方登录.这些业务场景都基本需要遵循以下流程: 客户端触发相关业务,并产生第三方应用的操作(比如支付) ...

  5. laravel 邮箱认证

    修改 User 模型,将 Laravel 自带的邮箱认证功能集成到我们的程序中 <?php namespace App\Models; use Illuminate\Notifications\ ...

  6. TODO:Laravel增加验证码

    TODO:Laravel增加验证码1. 先聊聊验证码是什么,有什么作用?验证码(CAPTCHA)是"Completely Automated Public Turing test to te ...

  7. TODO:Laravel 内置简单登录

    TODO:Laravel 内置简单登录 1. 激活Laravel的Auth系统Laravel 利用 PHP 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管 ...

  8. TODO:Laravel 使用blade标签布局页面

    TODO:Laravel 使用blade标签布局页面 本文主要介绍Laravel的标签使用,统一布局页面.主要用到到标签有@yield,@ stack,@extends,@section,@stop, ...

  9. TODO:搭建Laravel VueJS SemanticUI

    TODO:搭建Laravel VueJS SemanticUI Laravel是一套简洁.优雅的PHP开发框架(PHP Web Framework).可以让你从面条一样杂乱的代码中解脱出来:它可以帮你 ...

随机推荐

  1. gets(), getline(), cin.getline()

    gets(str), getline(cin, s), cin.getline(str, len),这三个函数都是读入一行字符串的函数,下面是这三个函数的区别 1. gets() 函数是 C 语言的函 ...

  2. html 动态生成

    function func_creatediv(item, index, input) { var ip = document.createElement("div"); ip.n ...

  3. git 基本操作小节操作(一) init clone status add 未完,参考链接在末尾

    1 $ git init 对当前所在目录进行git 管理 在当前目录初始化新仓库 2 $ git clone <url> <position> 从url克隆一个仓库到posti ...

  4. 三、统一威胁管理(UTM)

    简介 统一威胁管理(Unified Threat Management),简称UTM. 2004年9月,IDC首度提出“统一威胁管理”的概念,即将防病毒.入侵检测和防火墙安全设备划归统一威胁管理(Un ...

  5. python3练习100题——008

    今天第二道,做了明天就可以休息一下- 原题链接:http://www.runoob.com/python/python-exercise-example8.html 题目:输出 9*9 乘法口诀表. ...

  6. IText异常 NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable

    根据Itext的版本,查看依赖库的版本 maven地址:https://mvnrepository.com/artifact/com.itextpdf/itextpdf <dependency& ...

  7. Strategic game(无向?)二分图最小点覆盖(Poj1463,Uva1292)

    原题链接 此题求二分图的最小点覆盖,数值上等于该二分图的最大匹配.得知此结论可以将图染色,建有向图,然后跑匈牙利/网络流,如下.然而... #include<iostream> #incl ...

  8. 关于MySQL的tinyint(3)问题

    mysql 中int(1)和tinyint(1)中的1只是指定显示长度,并不表示存储长度.tinyint可以存储1字节, 即unsigned 0~255(signed -127~127).显示大小不受 ...

  9. AJAX-状态属性

    XMLHttpRequest对象的readyState属性 作用:表示xhr对象的请求状态 值:由0到4表示5个状态 0:请求尚未初始化 1:已经打开到WEB服务器的连接,正在向服务器发送请求 2:请 ...

  10. 如何创建redis集群

    1.下载redis源码包 wget http://download.redis.io/releases/redis-3.2.4.tar.gz 2.解压并安装 tar xvf redis-.tar.gz ...