thinkphp6事件
thinkphp6 事件详解
1.参考
2.介绍
什么是事件?
- 事件就是某些动作触发
- 比如你的鼠标点击一次就触发了一次事件,这个事件最终不过是执行了一段代码而已,确切的说,是执行了一个函数
所以我们需要监听这个鼠标的点击事件,如果鼠标点击(也就是监听到了事件),那么这段代码就执行
3.准备
为了后面的演示,我们需要先定义一个路由
route\app.php
<?php
use think\facade\Route;
use think\facade\Db;
Route::get('test', function () {
return 'hello';
});
接下来我们可以通过访问 /test 这个路由看到页面现实 hello
4.演示
- 监听事件
- 触发事件
- 事件执行
在thinkphp也一样需要这三个步骤
4.1 事件监听
可以通过命令行快速生成一个事件监听类
php think make:listener Click
需要在think这个文件所在的目录下执行这条命令,出现Listener:app\listener\Click created successfully 字样说明命令执行成功,可在 app\listener目录下找到一个Click.php文件
该命令已经自动生成了一些代码
<?php
declare (strict_types = 1);
namespace app\listener;
class click
{
/**
* 事件监听处理
*
* @return mixed
*/
public function handle($event)
{
//
}
}
我们在handle函数中编写一句代码 echo "监听点击事件";
<?php
declare (strict_types = 1);
namespace app\listener;
class click
{
/**
* 事件监听处理
*
* @return mixed
*/
public function handle($event)
{
echo "监听点击事件"; // 我们编写的代码
}
}
触发事件可以使用 event 函数来触发
event("click")
但是这个click事件到底是谁我们还没执行呢
4.2 事件触发
想要事件可以触发,那么就得让thinkphp知道这个click事件代表什么
找到 app\event.php 文件让click这个事件绑定刚才我们的类
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'click' => ['app\listener\Click'], // 绑定
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
],
'subscribe' => [
],
];
更改前面我们定义的路由
Route::get('test', function () {
event("click");
return 'hello';
});
4.3 代码执行
**访问 /test
可以看到代码执行了
总结就是,定义一个监听事件的类,在这个类中有一个handle函数,绑定事件与类,触发事件时,执行handle函数
5. 事件订阅
可以通过事件订阅机制,在一个监听器中监听多个事件
什么意思呢? 大白话就是一个类执行触发一个事件太浪费了,每定义一个事件就要新建一个监听类,可能有些繁琐,事件订阅可以让多个事件存在于一个类
比如 click 事件 对应着 监听类中的 click方法
命令行快速生成一个事件订阅类
php think make:subscribe Test
生成的代码文件
app\subscribe\Test.php
<?php
declare (strict_types = 1);
namespace app\subscribe;
class Test
{
}
然后在事件定义文件注册事件订阅者
app\event.php
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'click' => ['app\listener\Click'], // 绑定
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
],
'subscribe' => [
'app\subscribe\Test', // 注册事件订阅者
],
];
app\subscribe\Test.php
<?php
declare (strict_types = 1);
namespace app\subscribe;
class Test
{
public function click_1(){
echo "触发事件 click <br/>";
}
public function subscribe(\think\Event $event)
{
$event->listen('click_1', [$this,'click_1']); // 绑定事件方法
}
}
首先会执行 subscribe 方法,通过 $event->listen 进行事件与事件方法的绑定,也就是说每增加一个事件方法,就要使用 $event->listen 进行绑定
,我们再添加一个 move 事件
<?php
declare (strict_types = 1);
namespace app\subscribe;
class Test
{
public function click_1(){
echo "触发事件 click <br/>";
}
// 新增move事件
public function move(){
echo "触发事件 move <br/>";
}
public function subscribe(\think\Event $event)
{
$event->listen('click_1', [$this,'click_1']); // 绑定事件方法
$event->listen('move', [$this,'move']); // 绑定新增的move事件
}
}
路由文件,route\app.php
Route::get('test', function () {
event("click_1");
event("move");
return 'hello';
});
结果

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)