workerman 5.2.3 无内置统一响应类,但可基于 http\response 封装 apiresponse 静态类,支持 success/error 等方法返回标准 json 响应,自动设 content-type、状态码及 header,兼顾 restful 规范与扩展性。

Workerman 5.2.3 本身不内置“统一响应类”,但你可以基于 Workerman\Protocols\Http\Response 快速封装一个符合项目规范的响应工具,兼顾 RESTful API 常见需求:状态码、JSON 格式、可选数据/消息/错误码、Header 控制。
设计一个基础统一响应类
核心目标是减少重复构造 Response 对象的代码,统一 content-type、编码、结构格式。推荐使用静态方法封装,避免对象生命周期问题(Workerman 回调中不建议依赖实例方法):
- 返回标准 JSON 结构,如
{"code": 0, "msg": "success", "data": {...}} - 默认状态码为 200,错误时可覆盖为 4xx/5xx
- 自动设置
Content-Type: application/json; charset=utf-8 - 支持额外 header(如
X-Request-ID)和可选 cookie
示例代码:ApiResponse 类
注意:需确保已引入 Workerman 的 Response 类
use Workerman\Protocols\Http\Response;
class ApiResponse
{
public static function success($data = null, $msg = 'success', $code = 0, $headers = [], $cookies = [])
{
$body = json_encode([
'code' => $code,
'msg' => $msg,
'data' => $data,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$response = new Response(200, array_merge([
'Content-Type' => 'application/json; charset=utf-8',
], $headers), $body);
foreach ($cookies as $name => $value) {
$response->cookie($name, $value);
}
return $response;
}
public static function error($msg = 'error', $code = -1, $httpCode = 400, $data = null, $headers = [])
{
$body = json_encode([
'code' => $code,
'msg' => $msg,
'data' => $data,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$response = new Response($httpCode, array_merge([
'Content-Type' => 'application/json; charset=utf-8',
], $headers), $body);
return $response;
}
// 快捷 404、500 等常用状态
public static function notFound($msg = 'not found') {
return self::error($msg, 404, 404);
}
public static function serverError($msg = 'internal error') {
return self::error($msg, 500, 500);
}
}
在 onMessage 中使用
直接调用静态方法,传入连接对象即可发送:
$worker->onMessage = function ($connection, $request) {
if ($request->method() === 'GET' && $request->path() === '/api/user') {
$user = ['id' => 123, 'name' => '张三'];
$connection->send(ApiResponse::success($user));
} elseif ($request->method() === 'POST' && $request->path() === '/api/login') {
$params = $request->post();
if (empty($params['username'])) {
$connection->send(ApiResponse::error('用户名不能为空', 1001, 400));
return;
}
$connection->send(ApiResponse::success(['token' => 'xxx'], '登录成功'));
} else {
$connection->send(ApiResponse::notFound());
}
};
进阶建议
若需更灵活控制(如全局异常捕获、日志埋点、响应耗时头),可在封装类中加入:
- 记录请求 ID 和响应时间,通过
$response->header('X-Response-Time', ...) - 对敏感字段(如 password)做自动过滤(在
success()中预处理$data) - 结合 PSR-3 日志接口,在 error 方法中触发错误日志
- 多进程环境下慎用 static 属性存状态,所有逻辑保持无状态











