thinkphp6事件监听event-listene
事件系统可以看成是行为系统的升级版,相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。
事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了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
thinkphp6事件监听event-listene的更多相关文章
- Node.js 教程 05 - EventEmitter(事件监听/发射器 )
目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...
- .NET事件监听机制的局限与扩展
.NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeB ...
- [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播
-->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...
- [No00006A]Js的addEventListener()及attachEvent()区别分析【js中的事件监听】
1.添加时间监听: Chrom中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target ...
- java 事件监听 - 鼠标
java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...
- java 事件监听 - 键盘
java 事件监听 - 键盘 //事件监听 //键盘事件监听,写了一个小案例,按上下左右,改变圆形的位置,圆形可以移动 import java.awt.*; import javax.swing.*; ...
- java 事件监听 - 控件
java 事件监听 //事件监听 //事件监听,写了一个小案例,点击按钮改变面板的颜色. import java.awt.*; import javax.swing.*; import java.aw ...
- JS 中的事件绑定、事件监听、事件委托
事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...
- Javascript事件模型系列(三)jQuery中的事件监听方式及异同点
作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery>开始,到现在使用jQuery有一年 ...
随机推荐
- 线程 Threading
import time from threading import Thread def func(): while True: time.sleep(0.5) print(123) def func ...
- JDK API文档_1.6.0 中文版
链接:https://pan.baidu.com/s/1b0inUgYvEfjeusa3z_2p-g 密码:f8jk
- 什么是 inode ?
一般来说,面试不会问 inode .但是 inode 是一个重要概念,是理解 Unix/Linux 文件系统和硬盘储存的基础.理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做 ...
- vue3.0的更新和defineProperty优化?
放弃 Object.defineProperty ,使用更快的原生 Proxy (访问对象拦截器, 也成代理器) 提速, 降低内存使用, Tree-shaking更友好 支持IE11等 使用Types ...
- 在Spring的事务体系中,事务传播特性:Required和RequiresNew有何不同?
Required 如果当前存在一个事务,则加入当前事务.如果不存在任何事务,则创建一个新的事务.总之,要至少保证在一个事务中运行.PROPAGATION_REQUIRED通常作为默认的事务传播行为.p ...
- 构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载.
- 说说do...while和while的区别
一.do-while语句 do-while语句的语法: do{ statement }while(expression); 看下面示例: var i=10: do{ i+=2: }while(i< ...
- NULL 是什么意思 ?
NULL 这个值表示 UNKNOWN(未知):它不表示""(空字符串).对 NULL 这 个值的任何比较都会生产一个 NULL 值.您不能把任何值与一个 NULL 值进行比 较,并 ...
- Spark学习摘记 —— RDD转化操作API归纳
本文参考 在阅读了<Spark快速大数据分析>动物书后,大概了解到了spark常用的api,不过书中并没有给予所有api具体的示例,而且现在spark的最新版本已经上升到了2.4.5,动物 ...
- c语言实现两数交换的三种方法
实现变量的值互相交换的三种不同方法 方法一:利用第三个变量来实现数值的交换 int tmp; tmp = a; a = b; b = tmp; 此方法直观,简易.不易出错,推荐使用 方法二:利用两个变 ...