yansongda/pay的事件系统与扩展能力
文章概要介绍了yansongda/pay中事件系统的设计与实现,包括其核心组件、事件类型、监听器注册与触发机制,以及如何通过事件系统扩展支付功能。事件系统基于观察者模式,提供了支付流程中的关键节点扩展能力,支持动态监听器注册和优先级控制,同时通过懒加载、事件缓存和异步处理优化性能。
事件系统的设计与实现
在 yansongda/pay 中,事件系统是一个核心组件,用于在支付流程的关键节点触发自定义逻辑。通过事件系统,开发者可以监听支付过程中的各种事件(如支付开始、支付结束、HTTP请求等),并在事件触发时执行相应的回调逻辑。本节将深入探讨事件系统的设计思路、实现细节以及如何扩展事件能力。
事件系统的设计目标
事件系统的设计目标是为支付流程提供灵活的扩展点,使开发者能够在支付的生命周期中插入自定义逻辑。以下是事件系统的核心设计目标:
- 解耦:将支付流程中的关键节点与具体业务逻辑解耦,便于独立开发和维护。
- 可扩展性:支持动态添加和移除事件监听器,适应不同的业务需求。
- 高性能:事件触发和监听逻辑应高效,避免对支付流程的性能产生显著影响。
事件系统的架构
事件系统的架构基于观察者模式(Observer Pattern),主要由以下几个部分组成:
- 事件类:定义事件的类型和携带的数据。
- 事件监听器:注册到事件系统,用于处理特定事件的逻辑。
- 事件分发器:负责触发事件并通知所有注册的监听器。
以下是一个简化的类图,展示了事件系统的核心组件及其关系:
classDiagram
class Event {
+string $name
+array $data
+__construct(string $name, array $data)
+getName() string
+getData() array
}
class PayListener {
+handle(Event $event)
}
class Pay {
+array $listeners
+addListener(string $eventName, callable $listener)
+dispatch(Event $event)
}
Event <|-- PayStart
Event <|-- PayEnd
PayListener "1" *-- "1" Event
Pay "1" *-- "*" PayListener
事件类型与实现
在 yansongda/pay 中,事件类型覆盖了支付流程的各个环节。以下是部分核心事件及其用途:
| 事件名称 | 触发时机 | 携带数据示例 |
|---|---|---|
PayStart |
支付流程开始时触发 | 订单ID、支付金额、支付方式 |
PayEnd |
支付流程结束时触发 | 支付结果、回调数据 |
HttpStart |
HTTP请求发送前触发 | 请求URL、请求参数 |
HttpEnd |
HTTP请求完成后触发 | 响应数据、HTTP状态码 |
CallbackReceived |
接收到支付回调时触发 | 回调数据、签名验证结果 |
事件类的实现
每个事件类继承自基类 Event,并定义了特定的事件名称和数据。以下是一个事件类的代码示例:
<?php
namespace Yansongda\Pay\Event;
use Yansongda\Pay\Event;
class PayStart extends Event
{
public function __construct(array $data)
{
parent::__construct('pay.start', $data);
}
}
事件监听器的注册与触发
开发者可以通过 PayListener 类注册事件监听器。以下是一个监听器注册和事件触发的示例:
<?php
use Yansongda\Pay\Pay;
use Yansongda\Pay\Event\PayStart;
// 注册监听器
Pay::addListener('pay.start', function (PayStart $event) {
$data = $event->getData();
// 记录支付开始日志
Logger::info("Payment started for order: {$data['order_id']}");
});
// 触发事件
$event = new PayStart(['order_id' => '12345', 'amount' => 100]);
Pay::dispatch($event);
事件系统的扩展能力
事件系统支持以下扩展能力:
- 自定义事件:开发者可以定义自己的事件类,扩展支付流程的监听点。
- 动态监听器:可以在运行时动态添加或移除监听器,适应不同的业务场景。
- 优先级控制:通过监听器的优先级配置,控制多个监听器的执行顺序。
以下是一个动态添加监听器的示例:
<?php
use Yansongda\Pay\Pay;
// 动态添加监听器
Pay::addListener('http.start', function ($event) {
// 修改HTTP请求参数
$event->data['headers']['X-Custom-Header'] = 'value';
}, 100); // 优先级为100
事件系统的性能优化
为了确保事件系统的高性能,yansongda/pay 采用了以下优化措施:
- 懒加载监听器:监听器在首次触发时才会被初始化。
- 事件缓存:高频触发的事件会被缓存,减少重复初始化的开销。
- 异步处理:支持将事件处理逻辑异步化,避免阻塞主流程。
flowchart TD
A[事件触发] --> B{是否有监听器?}
B -->|是| C[执行监听器逻辑]
B -->|否| D[结束]
C --> D
通过以上设计,yansongda/pay 的事件系统不仅提供了强大的扩展能力,还能在高并发场景下保持高性能。
支付生命周期中的关键事件
在 yansongda/pay 中,事件系统是支付生命周期管理的核心组件之一。通过事件系统,开发者可以在支付流程的关键节点插入自定义逻辑,实现灵活的扩展能力。以下是支付生命周期中触发的主要事件及其作用:
1. HttpStart 与 HttpEnd
这两个事件分别标记了 HTTP 请求的开始和结束。HttpStart 在发起支付请求前触发,而 HttpEnd 在请求完成后触发。开发者可以利用这两个事件记录请求日志或进行性能监控。
class HttpStart extends Event {}
class HttpEnd extends Event {}
2. PayStart 与 PayEnd
PayStart 和 PayEnd 事件分别标志着支付流程的开始和结束。PayStart 在支付请求初始化时触发,适合用于校验支付参数或初始化资源;PayEnd 在支付完成后触发,可用于清理资源或发送通知。
class PayStart extends Event {}
class PayEnd extends Event {}
3. MethodCalled
当支付方法被调用时,MethodCalled 事件会被触发。它包含了调用的方法名和参数,适合用于调试或记录方法调用链。
class MethodCalled extends Event {}
4. CallbackReceived
在接收到支付回调时,CallbackReceived 事件会被触发。开发者可以利用此事件验证回调数据的合法性或执行后续业务逻辑。
class CallbackReceived extends Event {}
事件触发流程
以下是一个典型的支付生命周期事件触发顺序的流程图:
sequenceDiagram
participant User
participant Pay
participant EventSystem
User->>Pay: 发起支付请求
Pay->>EventSystem: 触发 HttpStart
Pay->>EventSystem: 触发 PayStart
Pay->>EventSystem: 触发 MethodCalled
Pay->>User: 返回支付结果
Pay->>EventSystem: 触发 PayEnd
Pay->>EventSystem: 触发 HttpEnd
User->>Pay: 支付回调
Pay->>EventSystem: 触发 CallbackReceived
事件的使用示例
以下是一个监听 PayStart 事件的代码示例:
use Yansongda\Pay\Pay;
use Yansongda\Pay\Event\PayStart;
Pay::on(PayStart::class, function (PayStart $event) {
// 获取支付参数
$params = $event->params;
// 自定义逻辑
logger()->info('支付开始', $params);
});
通过事件系统,yansongda/pay 实现了高度的灵活性和扩展性,开发者可以根据业务需求自由扩展支付流程。
事件监听器的注册与使用
在 yansongda/pay 中,事件系统是其核心功能之一,通过事件监听器可以灵活地扩展支付流程中的各个环节。本节将详细介绍如何注册和使用事件监听器,以便开发者能够充分利用事件系统的能力。
事件监听器的作用
事件监听器允许开发者在支付流程的关键节点插入自定义逻辑,例如:
- 在支付开始时记录日志。
- 在支付结束时发送通知。
- 在回调接收时验证数据。
事件监听器的注册
事件监听器通过实现 ListenerInterface 接口并注册到事件系统中。以下是一个典型的监听器注册流程:
1. 创建监听器类
监听器类需要实现 ListenerInterface 接口,并定义 process 方法。例如:
<?php
namespace App\Listeners;
use Yansongda\Pay\Event\PayStart;
use Yansongda\Artful\Contract\ListenerInterface;
class PayStartListener implements ListenerInterface
{
public function process(object $event): void
{
if ($event instanceof PayStart) {
// 自定义逻辑
logger()->info('支付开始', ['params' => $event->params]);
}
}
}
2. 注册监听器
监听器可以通过配置文件或动态方式注册。以下是动态注册的示例:
use Yansongda\Pay\Pay;
use App\Listeners\PayStartListener;
Pay::on(PayStart::class, [new PayStartListener(), 'process']);
事件监听器的使用
注册完成后,监听器会在对应事件触发时自动执行。以下是一些常见事件的使用场景:
1. PayStart 事件
在支付流程开始时触发,适合用于初始化或日志记录:
Pay::on(PayStart::class, function (PayStart $event) {
logger()->info('支付参数', $event->params);
});
2. PayEnd 事件
在支付流程结束时触发,适合用于通知或清理:
Pay::on(PayEnd::class, function (PayEnd $event) {
notifyUser('支付已完成');
});
3. CallbackReceived 事件
在接收到回调时触发,适合用于数据验证或处理:
Pay::on(CallbackReceived::class, function (CallbackReceived $event) {
if ($event->provider === 'alipay') {
validateAlipayCallback($event->contents);
}
});
事件监听器的优先级
可以通过 priority 参数调整监听器的执行顺序,数值越大优先级越高:
Pay::on(PayStart::class, [new HighPriorityListener(), 'process'], 100);
Pay::on(PayStart::class, [new LowPriorityListener(), 'process'], 10);
示例流程图
以下是一个支付流程中事件触发的顺序图:
sequenceDiagram
participant User
participant Pay
participant Listener
User->>Pay: 发起支付
Pay->>Listener: 触发 PayStart 事件
Listener->>Pay: 执行自定义逻辑
Pay->>User: 返回支付结果
Pay->>Listener: 触发 PayEnd 事件
Listener->>Pay: 执行清理逻辑
总结
通过事件监听器,开发者可以轻松扩展 yansongda/pay 的功能,实现高度定制化的支付流程。无论是日志记录、数据验证还是通知发送,事件系统都能提供灵活的支持。
通过事件系统扩展支付功能
yansongda/pay 的事件系统为开发者提供了强大的扩展能力,允许在支付流程的关键节点插入自定义逻辑。以下是如何利用事件系统扩展支付功能的详细说明。
事件系统概述
事件系统基于 Yansongda\Pay\Event 类及其子类实现,覆盖了支付流程的各个阶段。以下是核心事件类及其作用:
| 事件类 | 触发时机 | 典型用途 |
|---|---|---|
PayStart |
支付流程开始时 | 初始化支付参数或记录日志 |
PayEnd |
支付流程结束时 | 处理支付结果或发送通知 |
HttpStart |
HTTP 请求发起前 | 修改请求参数或添加签名 |
HttpEnd |
HTTP 请求完成后 | 解析响应数据或验证签名 |
MethodCalled |
支付方法调用时 | 动态修改方法行为 |
CallbackReceived |
收到支付回调时 | 验证回调数据或触发后续业务逻辑 |
事件监听与扩展
通过 PayListener 类,开发者可以监听这些事件并执行自定义逻辑。以下是一个示例,展示如何监听 PayStart 事件并添加自定义逻辑:
use Yansongda\Pay\Event\PayStart;
use Yansongda\Pay\Event;
Event::listen(PayStart::class, function (PayStart $event) {
// 在支付开始时记录日志
logger()->info('支付流程开始', [
'plugins' => $event->plugins,
'params' => $event->params,
]);
});
事件流程示例
以下是一个典型的支付流程中事件的触发顺序:
sequenceDiagram
participant User
participant Pay
participant EventSystem
User->>Pay: 发起支付请求
Pay->>EventSystem: 触发 PayStart 事件
EventSystem->>Pay: 执行自定义逻辑
Pay->>EventSystem: 触发 HttpStart 事件
EventSystem->>Pay: 修改请求参数
Pay->>PaymentGateway: 发送支付请求
PaymentGateway->>Pay: 返回支付结果
Pay->>EventSystem: 触发 HttpEnd 事件
EventSystem->>Pay: 解析响应数据
Pay->>EventSystem: 触发 PayEnd 事件
EventSystem->>Pay: 处理支付结果
Pay->>User: 返回支付结果
扩展支付功能
通过事件系统,开发者可以实现以下扩展功能:
-
动态修改支付参数
在HttpStart事件中修改请求参数,例如添加额外的签名或字段:Event::listen(HttpStart::class, function (HttpStart $event) { $event->rocket->params['extra_field'] = 'custom_value'; }); -
自定义支付结果处理
在PayEnd事件中处理支付结果,例如发送通知或更新订单状态:Event::listen(PayEnd::class, function (PayEnd $event) { $order = Order::find($event->rocket->params['out_trade_no']); $order->update(['status' => 'paid']); }); -
验证支付回调
在CallbackReceived事件中验证回调数据的合法性:Event::listen(CallbackReceived::class, function (CallbackReceived $event) { if (!$this->verifyCallback($event->data)) { throw new InvalidSignException('回调签名验证失败'); } });
总结
yansongda/pay 的事件系统为支付流程提供了灵活的扩展点,开发者可以通过监听事件实现自定义逻辑,从而满足复杂的业务需求。无论是动态修改参数、处理支付结果,还是验证回调数据,事件系统都能提供强大的支持。
yansongda/pay的事件系统通过解耦支付流程与业务逻辑,提供了强大的扩展能力。开发者可以监听支付生命周期中的关键事件(如PayStart、PayEnd、CallbackReceived等),动态插入自定义逻辑,实现参数修改、结果处理、回调验证等功能。事件系统的高性能设计和灵活架构使其成为支付流程扩展的核心工具,满足了复杂业务场景的需求。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00