thinkphp8 event

ThinkPHP 8 的事件系统基于观察者模式 ,它的核心作用是实现代码的解耦异步处理。简单来说,当你的业务代码(比如用户登录成功)执行到某个节点时,可以"触发"一个事件,而具体的后续处理逻辑(比如发送登录通知、记录登录日志)则交给"监听器"去完成。

在 ThinkPHP 8 中,使用事件主要分为以下四个步骤:

1. 快速生成事件和监听器

ThinkPHP 提供了便捷的命令行工具来生成标准的类文件:

  • 生成事件类:php think make:event UserLogin
  • 生成监听器类:php think make:listener SendNotification

2. 定义事件类(Event)

事件类主要负责承载和传递数据。你可以把业务中需要用到的数据通过构造函数传进去。

php 复制代码
// app/event/UserLogin.php
namespace app\event;

class UserLogin
{
    public $user;
    public $loginTime;

    public function __construct($user)
    {
        $this->user = $user;
        $this->loginTime = time();
    }
}
  1. 定义监听器类(Listener)

监听器类中包含一个 handle 方法,当对应的事件被触发时,这个方法会自动执行。

php 复制代码
// app/listener/SendNotification.php
namespace app\listener;
use app\event\UserLogin;

class SendNotification
{
    // handle 方法的参数会自动注入触发的事件对象
    public function handle(UserLogin $event)
    {
        // 获取事件传递过来的数据,执行具体的业务逻辑
        $userName = $event->user['name'];
        // 例如:发送登录成功的邮件或短信通知
        echo "发送登录通知给用户: " . $userName;
    }
}

4. 绑定事件与监听器

app/event.php 配置文件中,将事件和监听器关联起来。最常用的方式是使用 listen 进行配置:

php 复制代码
// app/event.php
return [
    'listen' => [
        // 当 UserLogin 事件被触发时,执行 SendNotification 监听器
        'UserLogin' => [
            'app\listener\SendNotification',
            // 一个事件可以绑定多个监听器,按顺序执行
            // 'app\listener\RecordLoginLog', 
        ],
    ],
];

5. 在业务代码中触发事件

在你的控制器或业务逻辑层,当用户登录成功后,使用 event() 助手函数(或 Event::trigger() 门面)来触发事件:

php 复制代码
// 假设在控制器的登录方法中
public function login()
{
    // ... 执行账号密码验证等登录逻辑 ...
    $user = ['id' => 1, 'name' => '张三'];

    // 登录成功后,触发 UserLogin 事件,并将用户数据传递出去
    event(new \app\event\UserLogin($user));
    
    return '登录成功';
}

💡 进阶技巧与常用场景

  • 处理高耗时任务(异步处理)
    ThinkPHP 内置了一个非常实用的系统事件叫 HttpEnd。这个事件会在HTTP 响应完全发送给客户端之后 才触发。你可以把发送邮件、同步数据到 Elasticsearch 等耗时操作放在 HttpEnd 的监听器里,这样用户就不需要等待这些操作完成,能极大地提升页面的响应速度。
  • 事件订阅(Subscribe)
    如果你有一个类需要监听很多个相关的事件(比如用户模块需要监听"用户注册"、"用户登录"、"用户注销"),可以使用"事件订阅者"来集中管理,避免 event.php 配置文件变得过于冗长。
相关推荐
漏刻有时3 小时前
PHP GeoJSON转PNG地图渲染程序开发笔记、源码解读、问题复盘与整改方案
android·笔记·php
always_TT5 小时前
【Python 日志记录:logging 模块入门】
开发语言·python·php
Immortal__y8 小时前
Upload-Labs 关卡防御方式
php
JonLee202010 小时前
适配 Yii 3.0,php-casbin/yii-permission 3.0 正式发布
安全·php·rbac·yii·权限·casbin
QH1392923188012 小时前
# R&S ZNB43 ZNA43 ZNA67矢量网络分析仪
开发语言·网络·php
名字还没想好☜14 小时前
Python concurrent.futures 实战:用 ThreadPoolExecutor 并发处理 + as_completed 收结果
数据库·python·php·并发
风样滴男人哟15 小时前
PHP特性之反射类ReflectionClass机制
android·开发语言·php
nvd1115 小时前
GCP L4 Passthrough 负载均衡器“假死超时”深度排查复盘
运维·php·负载均衡
2601_9657984717 小时前
ForumLab Review: Fast PHP Script for SEO Forum Sites
android·adb·php
姜太小白1 天前
【Linux】df -h 卡住问题的通用排查与解决方案总结
linux·运维·php