后置行为(Post-processing Actions)是在请求处理完成后执行的逻辑,通常用于对响应进行最终处理、记录日志、清理资源或完成业务闭环。以下是其核心作用及典型使用场景:
一、核心作用
-
响应后处理
- 对控制器返回的数据进行格式化、加密或压缩,例如将JSON响应统一添加时间戳或签名。
- 示例:
// 后置行为:JSON响应统一添加签名 class JsonSign { public function handle($response) { $data = $response->getData(); $data['sign'] = md5(json_encode($data) . SECRET_KEY); $response->setData($data); return $response; } }
-
日志记录与统计
- 记录请求耗时、状态码、异常信息,用于监控和排查问题。
- 示例:
// 后置行为:记录API调用日志 class ApiLogger { public function handle($request, $response) { Log::info("API: {$request->path()} | Status: {$response->status()}"); } }
-
资源清理
- 释放临时文件、关闭数据库连接或清理缓存。
- 示例:
// 后置行为:清理上传临时文件 class TempFileCleanup { public function handle($request) { if (isset($_FILES['avatar']['tmp_name'])) { unlink($_FILES['avatar']['tmp_name']); } } }
-
业务闭环
- 在事务性操作中完成最终提交或回滚。
- 示例:
// 后置行为:支付成功后更新订单状态 class PaymentFinalize { public function handle($paymentResult) { if ($paymentResult->isSuccess()) { Order::where('id', $paymentResult->order_id)->update(['status' => 'paid']); } } }
二、典型使用场景
1. 日志与监控
// 记录请求耗时和状态码
class RequestLog {
public function after($request, $response) {
$time = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
Log::channel('api')->info("URL: {$request->url()} | Time: {$time}s | Status: {$response->status()}");
}
}
2. 数据后处理
// 对敏感字段脱敏(如手机号)
class DataMasking {
public function after($response) {
$data = $response->json();
if (isset($data['user']['phone'])) {
$data['user']['phone'] = substr($data['user']['phone'], 0, 3) . '****' . substr($data['user']['phone'], -4);
}
$response->setData($data);
}
}
3. 缓存预热
// 首次访问后缓存热门数据
class CacheWarmer {
public function after($request, $response) {
if ($request->path() == '/hot-data') {
Cache::put('hot_data', $response->json(), 3600);
}
}
}
4. 第三方服务回调
// 支付回调后通知用户
class PaymentNotify {
public function after($paymentResult) {
if ($paymentResult->isPaid()) {
SMS::send($paymentResult->user_phone, "您的订单已支付成功!");
}
}
}
5. 异常统一处理
// 捕获未处理的异常并返回标准化响应
class ExceptionHandler {
public function after($exception) {
return Response::json([
'code' => 500,
'msg' => '系统繁忙,请稍后重试'
], 500);
}
}
三、与前置行为的对比
特性 | 后置行为 | 前置行为 |
---|---|---|
执行时机 | 请求处理完成后(控制器之后) | 路由匹配前 |
核心目的 | 响应增强、日志记录、资源清理 | 路由拦截、权限校验、参数过滤 |
典型场景 | 数据脱敏、缓存更新、日志统计 | 登录验证、参数校验、防刷机制 |
四、技术实现(以ThinkPHP为例)
// 定义后置行为
class AfterAction {
public function run(&$response) {
// 修改响应数据
$response->data['timestamp'] = time();
}
}
// 绑定到控制器或全局
Route::get('/user/:id', 'User/read')->after(AfterAction::class);
五、总结
后置行为是请求生命周期的最终环节,适用于:
- 响应优化:数据格式化、签名、脱敏。
- 业务闭环:支付回调、订单状态更新。
- 运维监控:日志记录、性能统计。
- 资源管理:临时文件清理、缓存预热。
通过合理使用后置行为,可实现代码解耦、增强系统健壮性,并提升用户体验。