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 配置文件变得过于冗长。
相关推荐
ID346107442035 分钟前
【课程设计】基于Spring Boot+Vue的校园共享无人机服务系统设计与实现-计算机毕设 附源码44219
javascript·vue.js·spring boot·python·node.js·php·课程设计
sbjdhjd2 小时前
ThinkPHP 5.0.10 缓存写入型 RCE 复盘:从手动搭建、换行绕过到源码单步验证 | 05
java·后端·安全·spring·网络安全·数据挖掘·php
en.en..3 小时前
TCP/UDP 收发流程(网络字节序---函数讲解)
开发语言·php
en.en..3 小时前
TCP/IP四层模型「数据包封装与拆包」| 网络传输
服务器·网络·php
aixingpan7 小时前
aixingpan.cn API开发文档:api_docs_trichart_natal_progression_ter_transit2接口指南
前端·php
gf13211117 小时前
python_调用远程服务器上的openclaw
服务器·python·php
czt_java7 小时前
网络核心初识:OSI七层、TCP/IP模型与数据传输全过程
网络·tcp/ip·php
Lysander.Jovian8 小时前
OpenStack使用_网页版
php·openstack
siner.li8 小时前
Mac通过brew安装的PHP8.0,编译安装swoole4
php
疯狂打码的少年20 小时前
【计算机网络】子网掩码与子网划分计算(含CIDR表示法)
服务器·笔记·计算机网络·php