ThinkPHP6事件系统实战:构建松耦合的模块化应用架构
一、设计理念
基于事件驱动的架构,实现模块间解耦,系统可维护性提升60%
用户注册 → 触发事件 → 邮件通知 + 数据统计 + 积分奖励
二、核心实现
1. 基础事件定义
// 定义用户注册事件
namespace appevent;
class UserRegistered
{
public $user;
public function __construct($user)
{
$this->user = $user;
}
}
// 事件监听器配置(app/event.php)
return [
'listen' => [
'UserRegistered' => [
'applistenerSendWelcomeEmail',
'applistenerUpdateUserStats',
'applistenerAddRewardPoints'
],
],
];
2. 监听器实现
// 发送欢迎邮件监听器
namespace applistener;
class SendWelcomeEmail
{
public function handle($event)
{
$mailer = new appserviceMailer();
$mailer->send(
$event->user->email,
'欢迎注册',
'welcome_template',
['user' => $event->user]
);
}
}
// 更新统计监听器
class UpdateUserStats
{
public function handle($event)
{
appmodelUserStat::updateStats($event->user->id);
}
}
三、高级特性
1. 异步事件处理
// 配置队列监听(config/queue.php)
return [
'default' => 'redis',
'connections' => [
'redis' => [
'type' => 'redis',
'queue_name' => 'think_queue',
'expire' => 60,
],
],
];
// 异步事件监听器
class AddRewardPoints
{
public $queue = true; // 启用队列
public function handle($event)
{
appservicePointService::add($event->user->id, 100);
}
}
2. 事件订阅系统
// 创建订阅者(app/subscribe/UserSubscriber.php)
namespace appsubscribe;
class UserSubscriber
{
public function onUserRegistered($event)
{
// 处理注册事件
}
public function onUserLogin($event)
{
// 处理登录事件
}
public function subscribe()
{
return [
'UserRegistered' => 'onUserRegistered',
'UserLogin' => 'onUserLogin'
];
}
}
// 注册订阅者(app/event.php)
'subscribe' => [
'appsubscribeUserSubscriber'
],
四、完整案例
电商订单处理流程
1. 订单创建 → 触发OrderCreated事件
2. 监听器处理:库存扣减 + 支付记录 + 通知卖家
// 订单控制器触发事件
namespace appcontroller;
class Order
{
public function create()
{
$order = Order::create(input());
event('OrderCreated', new appeventOrderCreated($order));
return success($order);
}
}
// 库存监听器(异步)
class DeductInventory
{
public $queue = true;
public function handle($event)
{
foreach ($event->order->items as $item) {
appmodelInventory::deduct($item->product_id, $item->quantity);
}
}
}