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

相关推荐

  • 在vue中定义一个防抖ref

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

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

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

    2024年 6月 17日
    192
  • php 简单的单例模式

    本文由 ChatMoney团队出品 单例模式是一种常用的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在 PHP 中实现单例模式通常有三种形式:饿汉式(Eager)、懒汉式(Lazy)和登记式(Register)。 使用注意事项: 不要使用反射(Reflection)机制来创建单例,因为这会实例化一个新的对象。 在使用懒…

    2024年 7月 2日
    173
  • 讲讲前端工程化

    本文由 ChatMoney团队出品 前言 在2010年前,前端只是一个项目的“附赠品”,对于整个项目来说他显得无关紧要,甚至没有前后端之分,但后来为了提升用户体验,工程师们不得不把界面和交互做的更加优美和便捷,于是前端慢慢地脱离出来变成了一个单独地岗位和方向。 随着前端项目复杂度的提升,传统的前端开发方式(html+css+js)已经无法满足复杂多变的开发需…

    2024年 8月 3日
    216
  • 时下最火的绘画应用:Midjourney和Diffusion有何区别

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

    2024年 6月 28日
    209

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信