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 配置文件变得过于冗长。
相关推荐
爱吃提升2 小时前
Yifan Hu(适合大规模数据)大数据算法
开发语言·算法·php
树下水月3 小时前
php artisan serve 在window上执行报错的问题
开发语言·php
棒棒的唐3 小时前
开发中,如何指定不同的php版本启动yii项目
开发语言·php
Cyber4K14 小时前
【Python专项】进阶语法-系统资源监控与数据采集(1)
开发语言·python·php
Le_ee15 小时前
ctfweb:php/php短标签/.haccess+图片马/XXE
开发语言·前端·php
Johnstons20 小时前
Wireshark 和 tcpdump 到底怎么选?网络故障排查实战中的边界、判断标准与落地清单
wireshark·php·es·tcpdump·抓包分析·抓包与协议分析工具选型
暮雨疏桐1 天前
阿里云从 OSS 将 CSV 推送至内网机器方案
阿里云·云计算·php
laomocoder1 天前
Project-Nexus-WAN-跨公网Agent对话
开发语言·php
d111111111d1 天前
MQTT+STM32+ESP8266网络程序分层+韦老师
笔记·stm32·单片机·嵌入式硬件·学习·php