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

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

    主要包括两大引擎  MyISAM,InnoDB 1.MyISAM与InnoDB的区别 2.常规的使用操作 1.MyISAM 节约空间,速度快 2.InnoDB 安全性高,事务的处理,多表操作.Inno ...

  2. 【网鼎杯】jocker--部分代码加壳逆向处理

    Main函数,用户输入flag,长度为24位 Wrong函数进行了简单的异或操作 Omg函数进行异或操作,根据提示来看应该是假check Encrypt无法生成伪代码 发现有加壳以及自修改,下断点动调 ...

  3. git tag、gitignore和git撤销提交

    前言 最近在git的使用过程中遇到了一些新的问题,所以写下来方便自己回忆. git tag 打标签 git tag -a v1.00 -m "注释" git tag 打标签命令 - ...

  4. mysql索引失效原理(联合索引失效问题)

    单值索引B+树图单值索引在B+树的结构里,一个节点只存一个键值对 联合索引开局一张图,由数据库的a字段和b字段组成一个联合索引. 从本质上来说,联合索引也是一个B+树,和单值索引不同的是,联合索引的键 ...

  5. springboot 设定访问项目的根路径

    springboot的配置文件application.yml: spring.mvc.view.prefix : / spring.mvc.view.suffix : .html server: po ...

  6. Mybatis框架基础入门(六)--动态sql

    主要是通过mybatis提供的各种标签方法实现动态拼接sql. 1.if标签 <!-- 根据条件查询用户 --> <select id="queryUserByWhere& ...

  7. 学习Haproxy (七)

    haproxy是个高性能的tcp和http的反向代理.它就是个代理.不像nginx还做web服务器 官网地址为www.haproxy.org nginx的优点和缺点 ? 1 2 3 4 5 6 7 8 ...

  8. ROS机器人操作系统相关书籍、资料和学习路径

    作者:Top Liu链接:https://zhuanlan.zhihu.com/p/30391098来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本文是易科机器人实验 ...

  9. 微信小程序加密数据(encryptedData)解密中的PHP代码,php7.1报错

    问题描述 最近在开发微信小程序涉及到加密数据(encryptedData)的解密,用的是PHP代码,在运行后报错mcrypt_module_ xxx is deprecated,提示方法已过时了 经研 ...

  10. 两个echarts地图联动高亮区域

    项目要求左右两张地图能够在鼠标悬浮的时候高亮部分联动,曾尝试了connect不好使,所以自己写了这段代码.代码思路为: 鼠标移入地图时,另一侧的地图根据鼠标悬浮获取到的区域name使该区域高亮: 鼠标 ...