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变现方案!

ChatMoney的头像ChatMoney
上一篇 2024年 7月 12日 上午11:03
下一篇 2024年 7月 16日 上午10:52

相关推荐

  • Vue3中组件使用ref时获取组件类型推导

    本文由 ChatMoney团队出品 我们在使用Vue3+ts开发时,常常会用到一些第三方组件库,比如Element-Plus UI、Navie UI等,这些UI框架中有些组件常常会暴露一些方法给我们便捷的去实现各种复杂的交互,我们经常会像下面这样去给组件定义一个ref去获取组件的实例: 这个方法可以正常使用,但是没有任何的ts类型推导,这也就丧失了一部分我们…

    2024年 7月 12日
    106
  • 简单实现suno-api账号保活

    本文由 ChatMoney团队出品 简介 之前的一个简易的项目suno-api。是使用cookie来获取suno-token发起请求的,之前写的简单,并没有做cookie保活,在运行一段时间后cookie会失效,api便失效了。那现在就来实现一个简单的账号保活。 保活原理 账号保活的实现原理比较简单,其实就是每隔一段时间去获取一次token。当然有其他保活方…

    2024年 6月 5日
    113
  • Vue3等比例缩放图片组件

      本文由 ChatMoney团队出品 有些情况我们需要在各种刁钻的情况下都要保持图片比例不变,比如用户缩放窗口等改变布局的情况。实现原理就是通过容器的宽度和内边距在保持你想要的比例。 以下是基础功能的组件示例: <template> <div style=”position: relative” :style=”ratioStr…

    2024年 6月 7日
    189
  • 时下最火的绘画应用:Midjourney和Diffusion有何区别

    本文由 ChatMoney团队出品 Midjourney与Stable Diffusion:对比分析 1. 易用性与部署 Midjourney: 在线操作:Midjourney的最大优势在于其无需下载,直接在线操作的特点。这使得用户可以轻松上手,无需担心硬件性能问题。 简单学习:由于其网页操作的特性,Midjourney的学习和使用都相对简单,适合快速生成创…

    2024年 6月 28日
    131
  • 简单实现Viper配置管理

    本文由 ChatMoney团队出品 简介 前面实现的一个简易suno-api。是使用cookie来获取suno-token发起请求的。当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了cookie的值,这种做法并不好,所以现在打算把cookie值改造为一个配置,通过viper来读取。 什么是viper Viper是一个用于Go语言的应用程序配…

    2024年 6月 6日
    118

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信