ThinkPHP6事件系统实战:5个高效解耦技巧 | PHP框架开发

2025-07-17 0 844

ThinkPHP6事件系统实战:5个高效解耦技巧

核心价值: ThinkPHP6的事件系统可以实现业务逻辑解耦。本文将展示5个电商系统中的实际应用场景,帮助开发者构建更易维护的架构。

1. 基础事件定义与触发

创建用户注册事件:

// 定义事件类 app/event/UserRegistered.php
namespace appevent;

class UserRegistered
{
    public $user;
    
    public function __construct($user)
    {
        $this->user = $user;
    }
}

// 触发事件(在控制器中)
public function register()
{
    // 用户注册逻辑...
    $user = User::create(input());
    
    // 触发事件
    event(new appeventUserRegistered($user));
    
    return success('注册成功');
}

2. 事件监听器配置

监听用户注册事件:

// 创建监听器 app/listener/SendWelcomeEmail.php
namespace applistener;

class SendWelcomeEmail
{
    public function handle($event)
    {
        $user = $event->user;
        // 发送欢迎邮件逻辑
        Mail::to($user->email)->send(new WelcomeMail($user));
    }
}

// 在app/event.php中注册
return [
    'bind' => [
    ],
    'listen' => [
        'UserRegistered' => [
            'applistenerSendWelcomeEmail',
            // 可以添加更多监听器
        ],
    ],
    // ...其他配置
];

3. 事件订阅器

使用订阅器管理多个事件:

// 创建订阅器 app/subscribe/UserSubscribe.php
namespace appsubscribe;

class UserSubscribe
{
    public function onUserRegistered($event)
    {
        // 记录注册日志
        Log::write("用户注册: {$event->user->id}");
    }
    
    public function onUserLogin($event)
    {
        // 更新最后登录时间
        $event->user->save(['last_login_time' => time()]);
    }
    
    public function subscribe($events)
    {
        return [
            'UserRegistered' => 'onUserRegistered',
            'UserLogin' => 'onUserLogin'
        ];
    }
}

// 在app/event.php中注册
'subscribe' => [
    'appsubscribeUserSubscribe'
],

4. 异步事件处理

使用队列处理耗时事件:

// 修改监听器实现ShouldQueue接口
namespace applistener;

use thinkqueueShouldQueue;

class ProcessOrder implements ShouldQueue
{
    public function handle($event)
    {
        // 处理订单逻辑(耗时操作)
        $this->generateInvoice($event->order);
        $this->updateInventory($event->order);
    }
    
    // 设置队列连接
    public $connection = 'redis';
    
    // 设置队列名称
    public $queue = 'order_processing';
}

// 触发事件(订单创建后)
event(new OrderCreated($order));
解耦方式 直接调用 事件系统
耦合度
可维护性
扩展性 优秀

5. 电商实战:订单状态变更

完整订单状态变更示例:

// 事件类 app/event/OrderStatusChanged.php
namespace appevent;

class OrderStatusChanged
{
    public $order;
    public $oldStatus;
    public $newStatus;
    
    public function __construct($order, $oldStatus, $newStatus)
    {
        $this->order = $order;
        $this->oldStatus = $oldStatus;
        $this->newStatus = $newStatus;
    }
}

// 监听器 app/listener/NotifyOrderStatus.php
namespace applistener;

class NotifyOrderStatus
{
    public function handle($event)
    {
        // 状态从待付款变为已付款
        if ($event->oldStatus == 0 && $event->newStatus == 1) {
            // 发送支付成功通知
            $this->sendPaymentSuccessMsg($event->order);
            
            // 触发库存扣减事件
            event(new InventoryDeduction($event->order));
        }
        
        // 状态变为已发货
        if ($event->newStatus == 2) {
            // 发送发货通知
            $this->sendShippingNotice($event->order);
        }
    }
}

// 在控制器中触发
$order->status = $newStatus;
if ($order->save()) {
    event(new OrderStatusChanged($order, $oldStatus, $newStatus));
}

ThinkPHP6的事件系统为业务解耦提供了优雅的解决方案,特别适合订单流程、用户行为跟踪等需要多系统协作的场景。

ThinkPHP6事件系统实战:5个高效解耦技巧 | PHP框架开发
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

淘吗网 thinkphp ThinkPHP6事件系统实战:5个高效解耦技巧 | PHP框架开发 https://www.taomawang.com/server/thinkphp/411.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务