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 配置文件变得过于冗长。
相关推荐
两个人的幸福12 小时前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo3 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack3 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982073 天前
PHP 扩展——从入门到理解
php
鹏仔先生4 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下4 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip4 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒5 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2505 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis5 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel