事件系统可以看成是行为系统的升级版,相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。

事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。

步骤一:准备登录入口

​

首先准备一个登录入口 ,该入口本地的虚拟路由为 /api/login

class User extends BaseController
{
public function login()
{
//执行登录操作
echo "login_entrance\n" ;
$user = \app\common\model\User::find(1)->toArray();
//登录成功后的操作,比如可以分配邀请奖励,写入登录日志等
echo "login_after\n";
} }

 

步骤二:创建事件

创建UserLoginAfterEvent事件,并在config/event.php配置文件中进行绑定

class UserLoginAfterEvent
{
public $user;
public function __construct($user)
{
$this->user = $user; echo "user_login_after_event\n";
} }

  

'bind'      => [
'UserLoginAfter' => \app\common\event\UserLoginAfterEvent::class
],

然后在user/login 方法后面增加触发事件代码

public function login()
{
//执行登录操作
echo "login_entrance\n" ;
$user = \app\common\model\User::find(1)->toArray();
//登录成功后的操作,比如可以分配邀请奖励,写入登录日志等
echo "login_after\n"; /** 触发事件 */
// 通过事件标识
event("UserLoginAfter", $user);
// 传入事件对象实例
event(new UserLoginAfterEvent($user));
}

  

这时执行 /api/login 的输出结果如下:


login_entrance
login_after user_login_after_event

  

经过验证 此时 使用事件标识触发 在UserLoginAfterEvent事件中 没有结果输出的。

步骤三:创建监听

创建事件监听类 UserLoginAfterListener.php,并在config/event.php配置文件中进行绑定


class UserLoginAfterListener
{
public function handle($user)
{
// 事件监听处理
echo "user_login_after_listener\n";
}
}
  

'listen'    => [
'UserLoginAfter' => [\app\common\listener\UserLoginAfterListener::class]
],

  

这时执行 /api/login 的输出结果如下:

login_entrance
login_after
user_login_after_listener
user_login_after_event
user_login_after_listener

  

另外在 UserLoginAfterListener 中打印 $user 的结果如下:

^ array:3 [  "id" => 1  "username" => "wangqy"  "password" => "123456"]
^ app\common\event\UserLoginAfterEvent {#88 +user: array:3 [ "id" => 1 "username" => "wangqy" "password" => "123456" ]}

  

结论

通过上述测试得出的结果如下:

1、使用事件标识来监听时 是不走定义的事件类的,只有在event方法中传入事件实例才能够在事件类进行操作值。

2、通过事件标识来监听时 ,在监听类中接受的值,是实际在触发事件时传入的参数,而通过事件类实例监听时,在监听类中拿到的是事件类实例。

注意:

在进行监听类绑定时,要注意标识后面的值是数组类型,使用下面这种方式,虽然没有报错,但是也不会生效。

'UserLoginAfter' => \app\common\listener\UserLoginAfterListener::class

参考链接:https://www.kancloud.cn/manual/thinkphp6_0/1037492

首发地址:http://upwqy.com/?p=405

thinkphp6事件监听event-listene的更多相关文章

  1. Node.js 教程 05 - EventEmitter(事件监听/发射器 )

    目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...

  2. .NET事件监听机制的局限与扩展

    .NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeB ...

  3. [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

    -->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...

  4. [No00006A]Js的addEventListener()及attachEvent()区别分析【js中的事件监听】

    1.添加时间监听: Chrom中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target ...

  5. java 事件监听 - 鼠标

    java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...

  6. java 事件监听 - 键盘

    java 事件监听 - 键盘 //事件监听 //键盘事件监听,写了一个小案例,按上下左右,改变圆形的位置,圆形可以移动 import java.awt.*; import javax.swing.*; ...

  7. java 事件监听 - 控件

    java 事件监听 //事件监听 //事件监听,写了一个小案例,点击按钮改变面板的颜色. import java.awt.*; import javax.swing.*; import java.aw ...

  8. JS 中的事件绑定、事件监听、事件委托

    事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...

  9. Javascript事件模型系列(三)jQuery中的事件监听方式及异同点

    作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery>开始,到现在使用jQuery有一年 ...

随机推荐

  1. 常用命令行指令 Windows & Linux

    一.Linux linux常用命令详解:https://www.cnblogs.com/yuncong/p/10247583.html 挂载U盘到linux一个文件夹中 二.Windows 1.查看电 ...

  2. 海量数据分析更快、更稳、更准。GaussDB(for MySQL) HTAP只读分析特性详解

    本文作者康祥,华为云数据库内核开发工程师,研究生阶段主要从事SPARQL查询优化相关工作.目前在华为公司参与华为云GaussDB(for MySQL) HTAP只读内核功能设计和研发. 1. 引言 H ...

  3. Cobalt Strike之LINK木马

    在同一目录下 新建一个exp.ps1 一个test.txt exp.ps1代码 $file = Get-Content "test.txt" $WshShell = New-Obj ...

  4. P5017 [NOIP2018 普及组] 摆渡车

    P5017 [NOIP2018 普及组] 摆渡车 题目 P5017 思路 将实际问题抽象后,不难发现这是一个 区间 \(DP\) 我们不妨认为时间是一条数轴,每名同学按照到达时刻分别对应数轴上可能重合 ...

  5. 关于IIS应用程序池的默认参数设置解决

    关于IIS应用程序池的默认参数设置,一般如下设置以满足IIS站点的需要. 1.关于IIS站点的启动模式,以及处理请求的管道模式设置. 2.回收机制设置, A)若IIS站点程序中存在单例模式访问DB数据 ...

  6. 西门子STEP7安装过程不断提示电脑重启的解决方法

    win+R打开注册表 进入 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 删除PendingFileR ...

  7. 一条SQL语句执行得很慢的原因有哪些

    说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 之前腾讯 ...

  8. 解释WEB 模块?

    Spring的WEB模块是构建在application context 模块基础之上,提供一个适合web应用的上下文.这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参 ...

  9. 使用redis作为django缓存数据库

    1.Redis的Windows版本.打开https://github.com/MSOpenTech/redis/releases下载msi安装包.该版本是64位.安装msi过程中,有个选项是否加入系统 ...

  10. 学习 Haproxy (四)

    一. haproxy 的安装配置 # cat /etc/redhat-release CentOS release 6.6 (Final) # uname -r 2.6.32-504.el6.i686 ...