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 配置文件变得过于冗长。
相关推荐
我是高手高手高高手32 分钟前
宝塔 PHP多版本,切换PHP默认版本
开发语言·php
运维行者_15 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
星光开发者17 小时前
基于springboot智慧草场牛羊管理系统-计算机毕设【课程设计】50360
vue.js·spring boot·后端·mysql·php·课程设计·express
weixin_BYSJ198717 小时前
电竞先锋网站---附源码02032
java·vue.js·spring boot·python·django·tomcat·php
郑州光合科技余经理18 小时前
同城小程序开发:同一笔单在用户端和商家端各显示到哪
android·java·开发语言·前端·后端·uni-app·php
2401_8724187820 小时前
互联网公开信息检索完全指南:Google、Yandex、Wayback Machine、DNS、WHOIS、Shodan 等 OSINT 工具大全
开发语言·php
aixingpan21 小时前
aixingpan.cnAPI开发文档:api_docs_trichart_natal_solar_return_transit2接口指南
前端·php
狗凯之家源码网1 天前
H5 棋牌对战系统源码深度评测与实战分析
php·游戏开发
李纲明1 天前
WordPress 后台登录马上被踢回登录页:Cookie 域、HTTPS、盐值和页面缓存怎么查
运维·缓存·https·php·wordpress·cookie
4SAPI1 天前
AI 数据分析工具大模型 API 选型指南
大数据·人工智能·架构·php·1024程序员节