ThinkPHP 6.0 错误码统一封装的核心是实现业务状态码、HTTP状态码与提示文案的解耦协同;通过集中配置(如config/error_code.php)、统一响应函数、验证/异常自动映射及控制器轻量调用约定,确保错误处理标准化、可维护、易扩展。

ThinkPHP 6.0 错误码统一封装的核心,是让业务状态码、HTTP 状态码、提示文案三者解耦又协同,避免散落在控制器、验证器、异常处理器中各自定义,导致前端难适配、运维难排查、后期难维护。
错误码集中配置管理
所有业务错误码必须定义在独立配置文件中(如 config/error_code.php),采用键值对形式,键为数字码,值为多语言标识符或默认中文描述:
-
不写死字符串:例如
1001 => 'user_not_found',而非1001 => '用户不存在',便于后续对接 lang() 多语言系统 -
分域归类:按模块前缀划分,如
'auth_login_fail'、'order_stock_insufficient'、'pay_signature_invalid',避免码值冲突 -
保留扩展性:配置支持数组结构,可附带 HTTP 状态码与日志等级,例如:
1001 => ['msg' => 'user_not_found', 'http' => 404, 'level' => 'warning']
统一响应构造函数封装
在 app/common/helper.php 或公共 trait 中提供标准响应生成方法,强制走配置中心取值:
- fail_result($code, $msg = '', $data = []):自动查 config('error_code') 获取默认文案,$msg 非空时优先使用传入值
- 支持显式覆盖:允许调用时指定 HTTP 状态码(如登录失败返回 401)、附加 trace_id 或 request_id
-
拒绝裸数组 return:所有控制器出口必须调用该函数,禁用直接
return ['code'=>1001,'msg'=>'xxx']
验证失败与异常的自动映射
验证器和全局异常不能绕过错误码体系,需建立映射规则:
立即学习“PHP免费学习笔记(深入)”;
-
ValidateException 自动转业务码:中间件或异常处理器中识别该异常,映射为
422(或自定义码如2001),并提取$e->getError()作为 msg -
系统异常兜底策略:未匹配到业务码的 Exception,默认返回
50000,文案为 'server_error',确保前端永远收到标准结构 -
HTTP 异常精准捕获:如
RouteNotFoundException映射为40401,ClassNotFoundException映射为50002,区分资源缺失与服务崩溃
控制器层轻量调用约定
控制器不负责拼结构,只专注语义表达:
-
Success/Failed 方法封装在 trait 中:例如
$this->success($data)默认 code=0、msg='ok';$this->failed(1001)自动查配置填 msg -
禁止硬编码数字码:不允许出现
$this->failed(1001)这类调用,应使用命名常量或配置键名,如$this->failed('user_not_found') - 支持链式扩展:方法返回 Response 对象,可追加 header 或 setStatusCode,满足鉴权、限流等场景需要



















