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有一年 ...
随机推荐
- SpringMVC前后端分离交互传参详细教程
温故而知新,本文为一时兴起写出,如有错误还请指正 本文后台基于SpringBoot2.5.6编写,前端基于Vue2 + axios和微信小程序JS版分别编写进行联调测试,用于理解前后端分离式开发的交互 ...
- CVE-2010-2861(Adobe ColdFusion 文件读取漏洞)
漏洞介绍 Adobe ColdFusion是美国Adobe公司的一款动态Web服务器产品,其运行的CFML(ColdFusion Markup Language)是针对Web应用的一种程序设计语言. ...
- redis 过期键的删除策略?
1.定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键 的过期时间来临时,立即执行对键的删除操作. 2.惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的 ...
- 会话缓存(Session Cache)?
最常用的一种使用 Redis 的情景是会话缓存(session cache).用 Redis 缓存会 话比其他存储(如 Memcached)的优势在于:Redis 提供持久化.当维护一个不 是严格要求 ...
- centos 7环境下安装部署zookeeper
近一直在看zookeeper的知识,有所收获,打算写些一些关于zookeeper的博客,也当做是自己的复习和笔记. 在上一篇 博客中简单地介绍了centos 7 下如何安装jdk,这一篇将介绍如何在c ...
- Markdown语法2
二 . 低频使用的语法 下面是相对用得少的markdown语法,但也值得学习学习. 10.区块(块引用) 要创建块引用,请在段落前添加一个 > 符号: 块引用支持多段落: 块引用支持嵌套,即引 ...
- pycharm2019版本可用破解
1.下载破解文件 点击链接https://pan.baidu.com/s/1FbpXC4-rACrLMfeuVzJGPQ 提取码:hyed 下载补丁文件jetbrains-agent.jar并将它 ...
- 2022首场MASA技术团队黑客松赛事大赛完美落幕!精彩集锦
Masa技术团队在2021年创立,这一年我们团队发布了我们第一个产品,Masa Blazor.登上了.NET Conf China,我们承诺,开源我们的产品,为开源社区增砖加瓦,一路上收获技术社区文章 ...
- three.js 入门详解(一)
1. 概述 1.1 什么是WebGL? WebGL是在浏览器中实现三维效果的一套规范 想要使用WebGL原生的API来写3D效果的话,很吃力.three.js是WebGL的一个开源框架,它省去了很多麻 ...
- ES6-11学习笔记--const
新声明方式:const 1.不属于顶层对象 window 2.不允许重复声明 3.不存在变量提升 4.暂时性死区 5.块级作用域 以上特性跟let声明一样,特性可看 let 的学习笔记:链接跳转 ...