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