ThinkPHP6事件系统使用指南

本文由 ChatMoney团队出品

在ThinkPHP 6中,事件系统提供了一种优雅的方式来实现解耦和动态响应。你可以通过注册事件和对应的监听者来处理各种应用逻辑。

事件注册

闭包注册

闭包是最简单的事件监听者,可以直接在注册时定义。

Event::listen("ClosureEvent", function(){var_dump("ClosureEvent1"); }); Event::listen("ClosureEvent", function(){var_dump("ClosureEvent2"); });

静态方法与普通方法注册

默认方法

首先定义一个事件类,并包含默认的处理方法。

// app\admin\event\testEvent.phpclass testEvent{// 默认方法public function handle(){var_dump("handle"); } }

然后在index.php中注册事件。

Event::listen("staticTest", "app\\admin\\event\\testEvent");
自定义方法

你也可以为事件类定义多个方法,并在注册时指定。

// app\admin\event\testEvent.php class testEvent{ public function commonTest1(){var_dump("commonTest1"); } public function commonTest2(){var_dump("commonTest2"); } public static function staticTest1(){var_dump("staticTest1"); } public static function staticTest2(){var_dump("staticTest2"); } }

index.php中按需注册这些方法。

Event::listen("staticTest", "app\\admin\\event\\testEvent::staticTest1"); Event::listen("staticTest", "app\\admin\\event\\testEvent::staticTest2"); Event::listen("commonTest", ["app\\admin\\event\\testEvent", "commonTest1"]); Event::listen("commonTest", ["app\\admin\\event\\testEvent", "commonTest2"]);

批量注册

如果需要注册多个监听者,可以使用批量注册方法。

Event::listenEvents([ "staticTest" => [ "app\\admin\\event\\testEvent::staticTest1", "app\\admin\\event\\testEvent::staticTest2"], "commonTest" => [ ["app\\admin\\event\\testEvent", "commonTest1"], ["app\\admin\\event\\testEvent", "commonTest2"], ], ]);

事件订阅者

手动订阅

在事件类中定义一个subscribe方法,手动添加监听者。

// app\admin\event\testEvent.phpclass testEvent{ // ... 已有方法 ... public function subscribe(\think\Event $event){$event->listen("commonDefaultTest", "\\app\\admin\\event\\testEvent"); $event->listen("commonTest", ["\\app\\admin\\event\\testEvent", "commonTest1"]);$event->listen("commonTest", ["\\app\\admin\\event\\testEvent", "commonTest2"]); $event->listen("staticTest", "\\app\\admin\\event\\testEvent::staticTest1");$event->listen("staticTest", "\\app\\admin\\event\\testEvent::staticTest2"); } }

index.php中订阅事件。

Event::subscribe(["app\\admin\\event\\testEvent"]);
智能订阅

事件类的方法名遵循特定格式时,可以自动识别并订阅。

class testEvent{ public function onCommonTest1(){ var_dump("onCommonTest1"); } public function onCommonTest2(){ var_dump("onCommonTest2"); } }

触发事件时,方法名需大写。

Event::trigger("CommonTest1"); Event::trigger("CommonTest2");

调用事件

你可以使用trigger方法来调用事件。

Event::trigger("commonTest"); event("commonTest");

高级用法

添加到监听者头部

通过设置listen方法的第三个参数为true,可以将监听者添加到监听者列表的头部。

Event::listen("staticTest","app\\admin\\event\\testEvent", true);

触发单个监听者

trigger方法的第三个参数设置为true时,如果有多个监听者,只触发第一个。

Event::trigger("CommonTest1", null, true);

移除事件

可以使用remove方法来移除特定的事件监听者。

Event::remove("staticTest");

别名

可以为事件定义别名,使得事件触发更加灵活。

Event::bind(["commonTest1" => "app\\admin\\event\\testEvent"]); Event::listen("commonTest1", ["app\\admin\\event\\testEvent", "commonTest1"]); Event::trigger("commonTest1"); Event::trigger("app\\admin\\event\\testEvent");

检查事件是否存在

hasListener方法可以用来检查某个事件是否有监听者。

Event::hasListener("commonTest1");

关于我们

本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统之多文件管理

makefile: makefile文件用于管理和组织代码工程的编译和链接,被make工具解析并完成相关动作 make: 工程管理工具 语法: 要生成的文件:依赖的所有文件 时间戳: 编译文件时,时间戳更新的文件需要重新加入编译,时间戳没有改变的不需要重新编译 app:main.c add.c sub.c …

如何追查一个packet在linux 系统哪里丢失

要想追一个包在系统哪里丢失了, 就要了解 一个应用层的包在送出时 要经历那些 检查点 和被丢掉的点。 1. 在传输层,如果是 tcp 包 会有contrack 的 buf 的限制 可能会导致 packets 的丢失。 > 检查办法:查看dmesg日志有报错:k…

MySQL数据库慢查询日志、SQL分析、数据库诊断

1 数据库调优维度 业务需求:勇敢地对不合理的需求说不系统架构:做架构设计的时候,应充分考虑业务的实际情况,考虑好数据库的各种选择(读写分离?高可用?实例个数?分库分表?用什么数据库?)SQL及索引:根据需求编写良…

C# 实体更新记录:如何捕获和记录字段变化到日志

方案一&#xff1a;粗糙但可用 var changes new List<string>();void CompareAndAddChange<T>(string propertyName, T oldValue, T newValue, Func<T, string> descriptionFunc null) {if (!EqualityComparer<T>.Default.Equals(oldValue, newVa…

分支定界法(Branch and Bound, 简称BB)是一种求解整数规划问题的有效算法。

分支定界法&#xff08;Branch and Bound&#xff09;详解与Python代码示例 分支定界法概述 分支定界法&#xff08;Branch and Bound, 简称B&B&#xff09;是一种求解整数规划问题的有效算法。它结合了搜索与迭代的思想&#xff0c;通过系统地枚举候选解来寻找最优解。在…

Java Web常见框架寻找路由技巧

在Java Web代码审计中&#xff0c;寻找和识别路由是很关键的部分。通过注册的路由可以找到当前应用对应的Controller&#xff0c;其作为MVC架构中的一个组件&#xff0c;可以说是每个用户交互的入口点。简单介绍下Java Web中常见框架&#xff08;Spring Web、Jersey&#xff09…

【SASS/SCSS(二)】模块化语法

目录 一、use 1、命名空间 2、私有变量 3、用with改变模块中的默认值 二、forward 1、给forward模块起别名&#xff0c;让成员加前缀 2、利用hide or show手动控制成员的可访问性 三、import 1、不存在命名空间&#xff0c;成员变量在import之后直接公开 2、可以在嵌…

springboot防止重复提交的方案有哪些

在Spring Boot中&#xff0c;防止接口或表单重复提交有多种策略&#xff0c;以下是几种常见且有效的方案&#xff1a; 前端控制&#xff1a; 禁用提交按钮&#xff1a;在表单提交后&#xff0c;使用JavaScript立即禁用提交按钮&#xff0c;防止用户再次点击。响应式提示&#x…

十、Java集合 ★ ✔(模块18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比较器排序、Collections、可变参数、Map】

day05 泛型,数据结构,List,Set 今日目标 泛型使用 数据结构 List Set 1 泛型 1.1 泛型的介绍 ★ 泛型是一种类型参数&#xff0c;专门用来保存类型用的 最早接触泛型是在ArrayList&#xff0c;这个E就是所谓的泛型了。使用ArrayList时&#xff0c;只要给E指定某一个类型…

讲真,现在留给2024年下半年软考的时间还够吗?

常识是个好东西&#xff0c;但是有时候却容易蒙蔽咱们的双眼&#xff0c;就拿下半年软考而言&#xff0c;看起来现在才7月份&#xff0c;刚刚入伏&#xff0c;考试要到11月份&#xff0c;是冬天呢&#xff0c;中间还隔了一个完整的秋季&#xff0c;常识感觉还很遥远&#xff0c…

【Vue3】4个比较重要的设计模式!!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 在我投身于前端开发的职业生涯期间,曾有一次承接了一个大型项目的维护工作。此项目运用的是 Vue 框架,然而其代码结构紊乱不堪,可维护性极度糟糕😫。 这使我深刻领会到,理解并运用 Vue 中的重要设计模式是何等关键! …

对LinkedList ,单链表和双链表的理解

一.ArrayList的缺陷 二.链表 三.链表部分相关oj面试题 四.LinkedList的模拟实现 五.LinkedList的使用 六.ArrayList和LinkedList的区别 一.ArrayList的缺陷: 1. ArrayList底层使用 数组 来存储元素&#xff0c;如果不熟悉可以来再看看&#xff1a; ArrayList与顺序表-CSDN…

一些常见的网络故障

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

【数据分析】Python数据分析实战:从零开始构建数据管道

Python数据分析实战&#xff1a;从零开始构建数据管道 引言一、数据获取二、数据清洗三、数据分析四、数据可视化五、案例研究&#xff1a;预测股票价格结论 我尝试访问您所提供的链接&#xff0c;但似乎该链接指向的内容已失效或被移除&#xff0c;因此无法直接获取并阅读该文…

【iOS】——ARC源码探究

一、ARC介绍 ARC的全称Auto Reference Counting. 也就是自动引用计数。使用MRC时开发者不得不花大量的时间在内存管理上&#xff0c;并且容易出现内存泄漏或者release一个已被释放的对象&#xff0c;导致crash。后来&#xff0c;Apple引入了ARC。使用ARC&#xff0c;开发者不再…

BUUCTF逆向wp [HDCTF2019]Maze

第一步 查壳&#xff0c;本题是32位&#xff0c;有壳&#xff0c;进行脱壳。 第二步 这里的 jnz 指令会实现一个跳转&#xff0c;并且下面的0EC85D78Bh被标红了&#xff0c;应该是一个不存在的地址&#xff0c;这些东西就会导致IDA无法正常反汇编出原始代码&#xff0c;也称…

中文科技核心论文发表

中文科技核心论文题目如下&#xff1a; 1.混凝土结构用纤维增强塑料筋的耐久性评述&#xff1a;适合建筑、结构、材料等专业 2.建筑工程用阻燃塑料的研究进展&#xff1a;适合建筑、材料专业 3.纤维增强热塑性塑料在面部护具中的应用研究&#xff1a;适合化工、医学、材料等专…

springcloud2021.x使用nacos做配置中心

spirngcloud2021.0.5使用nacos做配置中心遇到的问题 环境 jdk1.8&#xff0c;spring-boot 2.6.13&#xff0c;spring-cloud-alibaba 2021.0.5.0 &#xff0c;spring-cloud 2021.0.5 方案一 application.properties # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts…

C++中的condition_variable:条件变量

理解 C 中的条件变量&#xff08;Condition Variable&#xff09; 在多线程编程中&#xff0c;我们常常需要一个线程等待某个条件的变化&#xff0c;比如等待数据的生成或某个标志位的设置。如果没有条件变量&#xff08;condition_variable&#xff09;&#xff0c;线程可能会…

启智畅想火车类集装箱号码识别技术,软硬件解决方案

集装箱号码识别需求&#xff1a; 实时检测车皮号、火车底盘号码、集装箱号码&#xff0c;根据火车类型分为以下三种情况&#xff1a; 1、纯车皮&#xff0c;只检测车皮号&#xff1b; 2、火车拉货箱&#xff08;半车皮&#xff09;&#xff0c;检测车皮号集装箱号码&#xff1b…