根据官方文档thinkphp6的事件机制涉及三个类:事件类(event)、监听类(listener)、订阅类(subscribe)。官方的文档以及官方的视频都没把事件机制讲清楚。下面我以单应用为例用另一种方式给大家总结一下。

总的来说,事件机制的实现有两种途径:通过监听、通过订阅

【第一种】通过监听

1、创建监听类:在命令行模式下进入框架根目录执行

php think make:listener <自定义的类名>

例如:

php think make:listener UserListener

执行之后将在<框架根目录>\app\listener\下生成UserListener这个类。

2、配置监听:在<框架根目录>\app\event.php这个文件的listen数组中配置UserListener这个类,如下:

'listen'    => ['testEvent' => ['app\listener\UserListener']
],

3、触发监听:在你需要触发监听的地方加入如下代码

event('testEvent');

注意:这里的参数testEvent即为事件名称,可随便定义,但必须要与在event.php文件里配置的键名一致。

触发监听时你可以带上第二个参数。通过第二个参数你可以把任何数据传递到UserListener这个类中,也就是handle方法的参数(不明白啥意思的结合下面的完整代码理解)。

4、处理监听逻辑:在UserListener类的handle方法中完成业务逻辑

完整代码如下

Other:一个用来测试的类

<?phpnamespace app\controller;class Other
{public function hello(){echo 'hello function';}
}

Index:触发监听的类

<?php
namespace app\controller;use app\BaseController;class Index extends BaseController
{public $name  = 'index';public function test1(){//触发监听事件,无参数event('testEvent');}public function test2(){//触发监听事件,传递字符串event('testEvent', 'hello');}public function test3(){//触发监听事件,传递自身类event('testEvent', $this);}public function test4(){//触发监听事件,传递其他类$other  = new Other();event('testEvent', $other);}
}

UserListener:事件监听类

<?phpnamespace app\listener;class UserListener
{/*** 事件监听处理** @return mixed*/public function handle($event){//当调用Index类的test1方法时该代码有效,$event为nullvar_dump($event);//当调用Index类的test2方法时该代码有效,$event为字符串hellovar_dump($event);//当调用Index类的test3方法时该代码有效,$event为Index类的实例//可以访问Index类的name变量echo $event->name;//当调用Index类的test4方法时该代码有效,$event为Other类的实例//可以调用Other类的hello方法echo $event->hello();}
}

【第二种】通过订阅

1、创建订阅类:在命令行模式下进入框架根目录执行

php think make:subscribe <自定义的类名>

例如:

php think make:subscribe UserSubscribe

执行之后将在<框架根目录>\app\subscribe\下生成UserSubscribe这个类。

2、配置监听:在<框架根目录>\app\event.php这个文件的subscribe数组中配置UserSubscribe这个类,如下:

'subscribe' => ['app\subscribe\UserSubscribe'],

注意:为了测试效果,要把上面配置的UserListener从listen数组删除掉

3、触发监听:跟第一种途径一样

4、处理监听逻辑:处理监听的逻辑又有两种方法,我称之为自动绑定和手动绑定。手动绑定和自动绑定是互斥的,只能二选一。

4.1  自动绑定

在UserSubscribe类中添加ontestEvent方法,在该方法中完成业务逻辑。添加的方法名不能随意定义,规则是事件名称前面加上on。因为我们在event.php里定义的事件名称是testEvent,所以方法名就是ontestEvent(注意大小写)。监听方法定义之后就自动与事件绑定,所以我称之为自动绑定。

完整代码如下

Other和Index类的代码跟第一种途径一样

UserSubscribe:事件订阅类

<?phpnamespace app\subscribe;class UserSubscribe
{public function ontestEvent($user){//当调用Index类的test1方法时该代码有效,$event为nullvar_dump($user);//当调用Index类的test2方法时该代码有效,$event为字符串hellovar_dump($user);//当调用Index类的test3方法时该代码有效,$event为Index类的实例//可以访问Index类的name变量echo $user->name;//当调用Index类的test4方法时该代码有效,$event为Other类的实例//可以调用Other类的hello方法echo $user->hello();}
}

4.2  手动绑定

首先,创建事件类,负责处理具体的业务逻辑。在命令行模式下进入框架根目录执行:

php think make:event <自定义的类名>

例如:

php think make:event UserEvent

执行之后将在<框架根目录>\app\event\下生成UserEvent这个类。

再在该类中定义一个handle方法,该方法有一个传入参数。方法名和传入的参数名可以任意定义。具体的业务逻辑就可以放在handle方法里面处理。

然后,在UserSubscribe类中添加subscribe方法,该方法传入参数为 Event 对象。然后在该方法中将监听的事件绑定到UserEvent类的handle方法上。如下:

$event->listen('testEvent', [app('app\event\UserEvent'), 'handle']);

完整代码如下

Other和Index类的代码跟第一种途径一样

UserSubscribe:事件订阅类

<?php
declare (strict_types = 1);namespace app\subscribe;use think\Event;class UserSubscribe
{public function subscribe(Event $event){$event->listen('testEvent', [app('app\event\UserEvent'), 'handle']);}
}

UserEvent:事件处理类

<?php
declare (strict_types = 1);namespace app\event;class UserEvent
{public function handle($user){//当调用Index类的test1方法时该代码有效,$user为nullvar_dump($user);//当调用Index类的test2方法时该代码有效,$user为字符串hellovar_dump($user);//当调用Index类的test3方法时该代码有效,$user为Index类的实例//可以访问Index类的name变量echo $user->name;//当调用Index类的test4方法时该代码有效,$user为Other类的实例//可以调用Other类的hello方法echo $user->hello();}
}

总结:

1、通过监听的方式,每个事件都需要定义一个监听类来处理监听逻辑,并且在event.php的listen数组中配置

2、通过订阅的方式,如果采用自动绑定,则需要在订阅类中为每个事件定义一个监听方法(方法名不能自己定义),不需要定义subscribe方法;如果采用手动绑定,则定义subscribe方法,并为每一个事件绑定负责处理业务逻辑的具体方法(方法名可以自己定义)

3、通过监听的方式中,事件类基本上可有可无,因为创建的监听类本来就是专门处理对应的事件的业务逻辑的。并且监听类可以用事件类代替。

4、通过订阅的方式中,如果采用自动绑定,事件类也没有必要,因为在订阅类中为每个事件定义的监听方法本来就是专门处理对应的事件的业务逻辑的。如果采用手动绑定,也可以把监听方法写在订阅类中,那么事件类也就没必要了。但是个人认为手动绑定还是使用事件类比较好。订阅类只负责绑定,事件类负责处理具体业务逻辑,这样结构上比较清晰

5、其实通过监听的方式中,监听类(例子中的UserListener)可以替换成其他命名空间下的其他类,只要该类有一个handle方法就行,比如事件类。替换之后记得要在event.php配置文件中做对应修改。同理,通过订阅的方式中,也可以将订阅类(例子中的UserSubscribe)直接替换为其他类,但是要记得自动绑定需要在该类下有符合命名规则的方法,手动绑定需要在该类下有一个subscribe方法

浅显易懂地讲明白thinkphp6的事件机制相关推荐

  1. Javascript基础与面向对象基础~第六讲 Javascript中的事件机制

    回到目录 事件机制,在JS中感觉很容易让人接受,一个鼠标被按下时会发生一些事情,一个键盘的键被抬起时同样可以发生一些事情,这种比喻很容易让人接受,不是吗,呵呵. 下面我将JS中几个主要的事件说一下,然 ...

  2. 我也来说说js的事件机制

    原文链接:http://www.w3cfuns.com/notes/17398/8062de2558ef495ce6cb7679f940ae5c.html 学js,不懂事件机制,基本可以说学了js,就 ...

  3. Android事件机制详解

    转自:http://www.codeceo.com/article/android-event.html 1概述 在Android平台上,主要用到两种通信机制,即Binder机制和事件机制,前者用于跨 ...

  4. JavaScript 详说事件机制之冒泡、捕获、传播、委托

    DOM事件流(event  flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 事件捕获(event  capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会 ...

  5. 终于有人把赌徒谬误讲明白了

    导读:有个 倒霉孩子 打工人叫小明,去年的五一.端午.十一和今年的清明假期,小明都被老板叫去加班了.如今,老板还是那个老板,小明还是那个小明.小明却想,我都中枪那么多次了,今年五一总该轮不到我了吧? ...

  6. 终于有人把A/B测试讲明白了

    导读:对照实验有时也称为A/B测试.A/B/n 测试(强调多变体测试).实地实验.随机对照实验.分拆测试.分桶测试和平行飞行测试.本文带你了解一些相关术语及应用案例. 作者:罗恩·科哈维(Ron Ko ...

  7. 终于有人把区块链讲明白了

    导读:本文介绍区块链技术,包括区块链的概念.原理.特点和通用应用这4个部分. 大年初一,区块链及金融智能知识分享给你,祝你牛年发大财! 作者:王健宗 何安珣 李泽远 来源:大数据DT(ID:hzdas ...

  8. android 事件机制总结

    http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html http://www.cnblogs.com/sunzn/archive/20 ...

  9. 分享丨终于有人把云计算、大数据和人工智能讲明白了!

    导 读 本文作者凭借其天马行空的脑回路,用最深入浅出,清晰化的文字逻辑,讲明白了云计算.大数据和人工智能三者之间的关系. 故事里面三个角色: 兼具经济效益与情怀的云计算:努力把信息变为智慧的大数据:模 ...

最新文章

  1. 配置mysql主从服务器
  2. 普加甘特图集成到第三方JS框架(MiniUI、jQuery、Ext等)
  3. 区块链时代的拜占庭容错:Tendermint(四)
  4. mysql cstmt_MySQL
  5. 加入 Git 版本管理(git的基本使用)
  6. 通用职责分配软件原则之7-纯虚构原则
  7. linux c绑定cpu_Linux内核路径优化之多核心平台TCP优化
  8. Android MVP开发模式及Retrofit + RxJava封装
  9. NVM:使用nvm安装管理node版本
  10. 联想用u盘重装系统步骤_联想笔记本Y470 U盘重装系统过程教程
  11. HDMI接口定义,传输流程
  12. vant-ui 有赞ui官网打不开?
  13. 03. Excel_公式
  14. 总结:linux笔记-001
  15. Elasticsearch6.4专题之16:Ingest Node
  16. Android https 自签名和CA证书验证(基于OkHttp)
  17. 耕、林、园地分类搞不定?PIE-Engine机器学习带你攻克难题
  18. HbuilderX中的MuMu模拟器调试
  19. @Kubernetes(k8s)
  20. 2020 Deep Learning for Sensor-based Human ActivityRecognition Overview, Challenges and Opportunities

热门文章

  1. spark与python关系_spark: RDD与DataFrame之间的相互转换方法
  2. 02年六代雅阁的整备质量_雅阁8个月销12万台,兄弟英诗派不到3万台,为何差距这么大?...
  3. 执行还原操作_【操作技巧】SQL2014数据库存储路径的修改方法
  4. HVGA是320×480,WVGA800×480
  5. update更新excel如何指定列为memo_Excel也能设计回写类报表
  6. 【Vulkan学习记录-基础篇-2】用Vulkan画两个重叠的矩形
  7. Linux常用命令10 - unzip
  8. 【零基础C++入门基本知识指导】
  9. 如何查看windows系统是否为正版?
  10. 域名备案期间网站能打开正常访问吗?