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
Previous 2024年 7月 12日 上午11:03
Next 2024年 7月 16日 上午10:52

相关推荐

  • 简单实现Viper配置管理

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

    2024年 6月 6日
    247
  • 在vue中定义一个防抖ref

    本文由 ChatMoney团队出品 为什么ref要实现防抖 在vue的开发过程中,我们通常会使用到ref,但在我们需要对一个频繁的赋值操作做防抖操作时,我们通常只能通过编写一个独立的防抖函数来实现,这样相对会多一些步骤(麻烦一些)。例如我们给一个即时搜索框的input实现防抖输入(即在输入文本n秒之后才触发搜索,避免频繁请求后端接口浪费资源)时,我们不仅不能…

    2024年 6月 20日
    156
  • TypeScript中never类型的妙用

       本文由 ChatMoney团队出品 妙用一   当我们在一个项目中,可能会去改动一个在整个项目中应用很广泛的函数的参数类型,但是可能由于代码量比较庞大,我们不好排查改了之后哪些地方会出现问题,此时我们可以使用never类型来辅助我们的函数,当我们在原有的类型基础上添加了新的类型时,可能会导致else分支中的代码逻辑出现问题,此时我们…

    2024年 6月 12日
    237
  • 乐观锁与悲观锁在MySQL中的应用

    本文由 ChatMoney团队出品 在数据库管理系统中,锁机制是保证数据一致性和并发控制的重要手段。MySQL,作为广泛使用的数据库系统之一,提供了多种锁策略来处理并发访问时可能引发的数据不一致性问题。其中,乐观锁和悲观锁是两种截然不同但又互补的并发控制策略,它们在不同的应用场景下发挥着各自的优势。本文将深入探讨MySQL中的乐观锁与悲观锁概念、工作原理及实…

    2024年 8月 7日
    197
  • TypeScript中,如何利用数组生成一个联合类型

    本文由 ChatMoney团队出品 在开发中我们常常会遇到这样一个问题,代码如下: 我们想要传入一个参数到str,而且这个参数必须是arr数组中的某一个元素,这时我们希望的是可以直接得到这个arr的联合类型,接下来一般我们会使用传统的方法去声明类型,如下: 先不说这样的写法很笨,写的时候就已经很ex了,我们希望的是Strs可以根据上面arr的值来自动生成一个…

    2024年 7月 2日
    185

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信