PHPAPI成功响应怎么封装

wen PHP项目 4

本文目录导读:

PHPAPI成功响应怎么封装

  1. 基础封装(推荐)
  2. 直接使用JSON返回
  3. 面向对象的封装
  4. 带分页的响应(Laravel)
  5. 推荐的响应格式
  6. 最佳实践建议

在PHP中封装API成功响应通常有几种常见做法,我来给你介绍几种标准的封装方式:

基础封装(推荐)

<?php
class ApiResponse {
    /**
     * 成功响应
     * @param mixed $data 返回数据
     * @param string $message 提示信息
     * @param int $code 状态码
     */
    public static function success($data = null, $message = '操作成功', $code = 200) {
        $result = [
            'code' => $code,
            'message' => $message,
            'data' => $data,
            'timestamp' => time()
        ];
        return response()->json($result, $code);
    }
    /**
     * 错误响应
     * @param string $message 错误信息
     * @param int $code 状态码
     * @param mixed $data 附加数据
     */
    public static function error($message = '操作失败', $code = 400, $data = null) {
        $result = [
            'code' => $code,
            'message' => $message,
            'data' => $data,
            'timestamp' => time()
        ];
        return response()->json($result, $code);
    }
}
// 使用示例
class UserController extends Controller {
    public function getUser($id) {
        $user = User::find($id);
        if (!$user) {
            return ApiResponse::error('用户不存在', 404);
        }
        return ApiResponse::success($user, '查询成功');
    }
}

直接使用JSON返回

<?php
// 简单的响应函数
function apiSuccess($data = [], $message = 'success', $code = 200) {
    header('Content-Type: application/json; charset=utf-8');
    http_response_code($code);
    echo json_encode([
        'code' => $code,
        'message' => $message,
        'data' => $data,
        'timestamp' => time()
    ]);
    exit;
}
function apiError($message = 'error', $code = 400, $data = []) {
    header('Content-Type: application/json; charset=utf-8');
    http_response_code($code);
    echo json_encode([
        'code' => $code,
        'message' => $message,
        'data' => $data,
        'timestamp' => time()
    ]);
    exit;
}
// 使用
apiSuccess($userData, '获取成功');
apiError('参数错误', 422);

面向对象的封装

<?php
namespace App\Helpers;
class ApiResponse {
    private $data;
    private $message;
    private $code;
    private $status;
    public function __construct() {
        $this->data = null;
        $this->message = '';
        $this->code = 200;
        $this->status = true;
    }
    public function setData($data) {
        $this->data = $data;
        return $this;
    }
    public function setMessage($message) {
        $this->message = $message;
        return $this;
    }
    public function setCode($code) {
        $this->code = $code;
        return $this;
    }
    public function success() {
        $this->status = true;
        $this->code = 200;
        return $this->toJson();
    }
    public function error($message = '', $code = 400) {
        $this->status = false;
        $this->message = $message ?: '操作失败';
        $this->code = $code;
        return $this->toJson();
    }
    private function toJson() {
        return response()->json([
            'success' => $this->status,
            'code' => $this->code,
            'message' => $this->message,
            'data' => $this->data,
            'timestamp' => time()
        ], $this->code);
    }
}
// 使用
$response = new ApiResponse();
$response->setData($data)
         ->setMessage('登录成功')
         ->success();

带分页的响应(Laravel)

<?php
trait ApiResponseTrait {
    public function success($data, $message = '操作成功') {
        return response()->json([
            'code' => 200,
            'message' => $message,
            'data' => $data
        ]);
    }
    public function successWithPaginate($data, $message = '查询成功') {
        return response()->json([
            'code' => 200,
            'message' => $message,
            'data' => $data->items(),
            'meta' => [
                'current_page' => $data->currentPage(),
                'last_page' => $data->lastPage(),
                'per_page' => $data->perPage(),
                'total' => $data->total()
            ]
        ]);
    }
}
// Controller中使用
class ArticleController extends Controller {
    use ApiResponseTrait;
    public function index() {
        $articles = Article::paginate(10);
        return $this->successWithPaginate($articles);
    }
    public function store(Request $request) {
        $article = Article::create($request->all());
        return $this->success($article, '创建成功');
    }
}

推荐的响应格式

{
    "code": 200,
    "message": "操作成功",
    "data": {
        "id": 1,
        "name": "张三",
        "email": "zhangsan@example.com"
    },
    "timestamp": 1645567890
}

最佳实践建议

  1. 统一响应格式:整个项目中保持一致的响应结构
  2. 规范状态码:使用HTTP标准状态码
  3. 添加时间戳:便于客户端和调试
  4. 使用辅助方法:避免重复代码
  5. 考虑国际化:消息字段支持多语言

根据你的项目框架(原生PHP、Laravel、ThinkPHP等)选择合适的封装方式,如果是Laravel项目,推荐使用第一种或第四种方式。

抱歉,评论功能暂时关闭!