{{wikiTitle}}
事件机制说明
目录:
CRMEB多店系统事件机制说明
概述
CRMEB多店系统基于ThinkPHP 6.0的事件机制,实现了业务逻辑的解耦。事件机制允许在特定操作发生时触发相应的监听器,执行额外的业务逻辑。
事件配置文件
事件配置位于 app/event.php 文件中:
return [
'bind' => [],
'listen' => [
// 事件名称 => [监听器类列表]
'user.register' => [\app\listener\user\Register::class],
'order.create' => [\app\listener\order\Create::class],
// ...
],
'subscribe' => [],
];
系统事件列表
1. 用户相关事件
| 事件名称 | 监听器 | 说明 |
|---|---|---|
| user.register | Register::class | 用户注册事件 |
| user.cancelUser | CancelUser::class | 用户注销事件 |
| user.login | Login::class | 用户登录事件 |
| user.vipPay | VipUser::class | 用户购买VIP支付成功 |
| user.recharge | Recharge::class | 用户储值支付成功 |
| user.rechargeRefund | RechargeRefund::class | 用户储值退款成功 |
| user.extract | Extract::class | 用户申请提现 |
| user.work | UserBindWorkMember::class | 用户绑定企业微信成员 |
| user.create | CreateSuccess::class | 用户创建事件 |
| user.update | UpdateSuccess::class | 用户更新事件 |
| user.client | UserBindClient::class | 用户绑定企业微信客户 |
| user.member.update | MemberUpdateSuccess::class | 会员更新事件 |
| user.address.update | AddressUpdateSuccess::class | 修改用户地址事件 |
| user.activate.level | ActivateLevel::class | 用户激活会员卡 |
2. 订单相关事件
| 事件名称 | 监听器 | 说明 |
|---|---|---|
| cart.add | AddCart::class | 加入购物车事件 |
| order.create | Create::class | 订单创建事件 |
| order.price | PriceRevision::class | 订单改价格事件 |
| order.applyRefund | ApplyRefund::class | 订单退款申请事件 |
| order.refuseRefund | RefuseRefund::class | 订单拒绝退款申请事件 |
| order.refund | Refund::class | 订单退款事件 |
| order.pay | Pay::class | 订单支付事件 |
| order.delivery | Delivery::class | 订单发货事件 |
| order.take | Take::class | 订单收货事件 |
| order.comment | Comment::class | 订单评价事件 |
| order.cancel | Cancel::class | 订单取消删除事件 |
| order.writeoff | Writeoff::class | 订单核销事件 |
| order.routine.shipping | OrderShipping::class | 小程序发货信息事件 |
3. 支付相关事件
| 事件名称 | 监听器 | 说明 |
|---|---|---|
| pay.create.order | PayCreateOrderListener::class | 支付订单创建事件 |
| pay.notify | PayNotifyListener::class | 支付异步回调事件 |
| pay.mchNotify | PayMchNotifyListener::class | 商家转账异步回调事件 |
| pay.scan.notify | ScannedNotifyListener::class | 支付扫码异步回调 |
4. 商品相关事件
| 事件名称 | 监听器 | 说明 |
|---|---|---|
| product.create | CreateSuccess::class | 商品创建事件 |
| product.delete | DeleteSuccess::class | 商品删除事件 |
| product.status | StatusSuccess::class | 商品状态事件 |
| product.reply | Reply::class | 商品评价事件 |
| product.collect | Collect::class | 商品收藏事件 |
| product.reply.update | ReplyUpdateSuccess::class | 更新评论事件 |
| product.shipping.update | ShippingUpdateSuccess::class | 修改运费模板事件 |
5. 门店/供应商事件
| 事件名称 | 监听器 | 说明 |
|---|---|---|
| store.verify | ApplyVerify::class | 门店入驻审核事件 |
| store.create | StoreSuccess::class | 创建门店事件 |
| store.delete | DeleteSuccess::class | 删除门店事件 |
| store.status | StatusSuccess::class | 门店状态事件 |
| supplier.verify | ApplyVerify::class | 供应商入驻审核事件 |
| supplier.create | SupplierSuccess::class | 创建供应商事件 |
| supplier.delete | DeleteSuccess::class | 删除供应商事件 |
| supplier.status | StatusSuccess::class | 供应商状态事件 |
6. 系统事件
| 事件名称 | 监听器 | 说明 |
|---|---|---|
| admin.login | LoginSuccess::class | 后台登录事件 |
| admin.logout | LogoutSuccess::class | 后台退出事件 |
| diy.update | DiyUpdateSuccess::class | DIY更新事件 |
| config.create | CreateSuccess::class | 创建配置事件 |
| config.delete | DeleteSuccess::class | 删除配置事件 |
| config.status | StatusSuccess::class | 配置状态事件 |
| notice.notice | Notice::class | 通知消息事件 |
| sms.sendAfter | SendAfterSuccess::class | 短信发送后事件 |
| crontab | SystemTimer::class | 定时执行事件 |
7. 社区事件
| 事件名称 | 监听器 | 说明 |
|---|---|---|
| community.operate | CommunityOperate::class | 帖子操作事件 |
| community.delete | CommunityDelete::class | 帖子删除事件 |
| community.like | CommunityLike::class | 帖子点赞事件 |
| community.comment.operate | CommunityCommentOperate::class | 评论操作事件 |
| community.comment.delete | CommunityCommentDelete::class | 评论删除事件 |
8. Swoole事件
| 事件名称 | 监听器 | 说明 |
|---|---|---|
| swoole.init | InitSwooleLockListen::class | Swoole初始化事件 |
| swoole.workerStart | SwooleCronListen::class | Swoole定时任务 |
| swoole.shutDown | SwooleShutdownListen::class | Swoole停止事件 |
| swoole.websocket.user | UserHandler::class | WebSocket用户事件 |
| swoole.websocket.admin | AdminHandler::class | WebSocket后台事件 |
| swoole.websocket.kefu | KefuHandler::class | WebSocket客服事件 |
| swoole.websocket.store | StoreHandler::class | WebSocket门店事件 |
| swoole.websocket.supplier | SupplierHandler::class | WebSocket供应商事件 |
| swoole.websocket.cashier | CashierHandler::class | WebSocket收银台事件 |
监听器开发规范
1. 监听器目录结构
app/listener/
├── activity/ # 活动监听器
├── community/ # 社区监听器
├── notice/ # 通知监听器
├── order/ # 订单监听器
├── pay/ # 支付监听器
├── product/ # 商品监听器
├── sms/ # 短信监听器
├── store/ # 门店监听器
├── supplier/ # 供应商监听器
├── system/ # 系统监听器
├── user/ # 用户监听器
├── wechat/ # 微信监听器
└── work/ # 企业微信监听器
2. 监听器基本结构
<?php
namespace app\listener\order;
use crmeb\interfaces\ListenerInterface;
/**
* 订单创建事件监听器
* Class Create
* @package app\listener\order
*/
class Create implements ListenerInterface
{
/**
* 事件处理
* @param $event 事件数据
* @return void
*/
public function handle($event): void
{
// 解构事件数据
[$orderInfo, $group, $activity, $invoice_id] = $event;
// 业务逻辑处理
$uid = (int)($orderInfo['uid'] ?? 0);
$oid = (int)$orderInfo['id'];
// 调用队列任务
OrderJob::dispatchDo('computeOrderProductTruePrice', [
$orderInfo['uid'],
$orderInfo['id']
]);
// 更多处理逻辑...
}
}
3. 监听器接口定义
<?php
namespace crmeb\interfaces;
interface ListenerInterface
{
/**
* 事件处理方法
* @param mixed $event 事件数据
* @return void
*/
public function handle($event): void;
}
事件触发方式
1. 使用event()助手函数
// 触发事件,传递数据
event('order.create', [$orderInfo, $group, $activity, $invoice_id]);
// 触发用户注册事件
event('user.register', [$userInfo]);
// 触发支付成功事件
event('order.pay', [$orderId, $orderInfo]);
2. 使用Event门面类
use think\facade\Event;
// 触发事件
Event::trigger('order.create', [$orderInfo, $group, $activity, $invoice_id]);
// 监听事件(动态添加)
Event::listen('order.create', function($event) {
// 处理逻辑
});
实战示例
示例1:创建自定义事件监听器
步骤1:创建监听器文件
<?php
// app/listener/custom/MyCustomListener.php
namespace app\listener\custom;
use crmeb\interfaces\ListenerInterface;
class MyCustomListener implements ListenerInterface
{
public function handle($event): void
{
// 获取事件数据
$data = $event[0] ?? [];
// 业务处理
$this->processData($data);
}
protected function processData($data)
{
// 具体业务逻辑
}
}
步骤2:注册事件
在 app/event.php 中添加:
'listen' => [
// ... 其他事件
'my.custom.event' => [\app\listener\custom\MyCustomListener::class],
],
步骤3:触发事件
// 在需要的地方触发事件
event('my.custom.event', [$data]);
示例2:订单支付成功事件详解
<?php
namespace app\listener\order;
use app\jobs\order\OrderJob;
use app\jobs\order\OrderStatusJob;
use app\jobs\user\UserLevelJob;
use app\jobs\spread\AgentJob;
use crmeb\interfaces\ListenerInterface;
class Pay implements ListenerInterface
{
public function handle($event): void
{
[$id, $orderInfo] = $event;
// 1. 计算订单佣金
OrderJob::dispatchDo('computeOrderBrokerage', [
$orderInfo['uid'],
$orderInfo['id']
]);
// 2. 写入订单支付记录
OrderStatusJob::dispatch([
$orderInfo['id'],
'pay_success',
[
'change_message' => '用户付款成功',
'change_manager_type' => 'user'
]
]);
// 3. 检测会员等级
UserLevelJob::dispatch([(int)$orderInfo['uid']]);
// 4. 处理分销等级升级
AgentJob::dispatch([(int)$orderInfo['uid']]);
// 5. 处理拼团逻辑
if ($orderInfo['activity_id'] && $orderInfo['type'] == 3) {
PinkJob::dispatchDo('createPink', [$orderInfo]);
}
}
}
示例3:用户注册事件
<?php
namespace app\listener\user;
use app\jobs\notice\SmsJob;
use app\jobs\user\UserJob;
use crmeb\interfaces\ListenerInterface;
class Register implements ListenerInterface
{
public function handle($event): void
{
[$user] = $event;
// 1. 发送注册短信
SmsJob::dispatchDo('sendRegisterSms', [$user['phone']]);
// 2. 赠送新人优惠券
UserJob::dispatchDo('giveNewUserCoupon', [$user['uid']]);
// 3. 处理推广关系
if ($user['spread_uid']) {
UserJob::dispatchDo('handleSpreadRelation', [
$user['uid'],
$user['spread_uid']
]);
}
}
}
与队列任务结合
事件监听器中通常会调用队列任务来异步处理业务:
// 立即执行
OrderJob::dispatch([$orderId]);
// 指定方法执行
OrderJob::dispatchDo('methodName', [$param1, $param2]);
// 延迟执行(单位:秒)
UnpaidOrderCancelJob::dispatchSece(3600, [$orderId]);
注意事项
- 事件命名规范:使用
模块.操作格式,如order.create、user.login - 监听器解耦:监听器之间应保持独立,避免相互依赖
- 异步处理:耗时操作应使用队列任务异步处理
- 异常处理:监听器中应做好异常捕获,避免影响主流程
- 性能考虑:一个事件可以有多个监听器,但要注意执行顺序和性能
常见问题
Q: 如何判断事件是否触发?
A: 可以在监听器中添加日志记录:
\think\facade\Log::info('event triggered', $event);
Q: 如何动态添加事件监听?
A: 使用Event门面类:
Event::listen('order.create', function($event) {
// 动态添加的处理逻辑
});
Q: 事件监听器执行顺序是什么?
A: 按照 event.php 中配置的数组顺序依次执行
评论({{cateWiki.comment_num}})
{{commentWhere.order ? '评论从旧到新':'评论从新到旧'}}
{{cateWiki.page_view_num}}人看过该文档
评论(0)
{{commentWhere.order ? '评论从旧到新':'评论从新到旧'}}
14人看过该文档
{{item.user ? item.user.nickname : ''}}
(自评)
{{item.content}}
{{item.create_time}}
删除
搜索结果
为您找到{{wikiCount}}条结果
{{item.page_view_num}}
{{item.like ? item.like.like_num : 0}}
{{item.comment ? item.comment.comment_num : 0}}
位置:
{{path.name}}
{{(i+1) == item.catalogue.path_data.length ? '':'/'}}