本书未发布

4.1. 封装统一的返回消息

未匹配的标注

通过多次尝试,以及和同事一起开发互相磨合,我感觉下面展示的这种返回消息格式似乎更容易被前端接受。

创建 ApiResponse.php 文件

切换回主分支;

$ git checkout  master

app/Api/Helpers 目录 (不存在目录自己新建) 下新建 ApiResponse.php
填入内容如下:

<?php
namespace App\Api\Helpers;
use Symfony\Component\HttpFoundation\Response as FoundationResponse;
use Response;

trait ApiResponse
{
    /**
     * 拦截http状态码
     * @var int
     */
    protected $statusCode = FoundationResponse::HTTP_OK;

    /**
     * @return mixed
     */
    public function getStatusCode()
    {
        return $this->statusCode;
    }

    /**
     * @param $statusCode
     * @return $this
     */
    public function setStatusCode($statusCode,$httpCode=null)
    {
        $httpCode = $httpCode ?? $statusCode;
        $this->statusCode = $statusCode;
        return $this;
    }

    /**
     * @param $data
     * @param array $header
     * @return mixed
     */
    public function respond($data, $header = [])
    {

        return Response::json($data,$this->getStatusCode(),$header);
    }

    /**
     * @param $status
     * @param array $data
     * @param null $code
     * @return mixed
     */
    public function status($status, array $data, $code = null){

        if ($code){
            $this->setStatusCode($code);
        }
        $status = [
            'status' => $status,
            'code' => $this->statusCode
        ];

        $data = array_merge($status,$data);
        return $this->respond($data);

    }

    /**
     * @param $message
     * @param int $code
     * @param string $status
     * @return mixed
     */
    /*
     * 格式
     * data:
     *  code:422
     *  message:xxx
     *  status:'error'
     */
    public function failed($message, $code = FoundationResponse::HTTP_BAD_REQUEST,$status = 'error'){

        return $this->setStatusCode($code)->message($message,$status);
    }

    /**
     * @param $message
     * @param string $status
     * @return mixed
     */
    public function message($message, $status = "success"){

        return $this->status($status,[
            'message' => $message
        ]);
    }

    /**
     * @param string $message
     * @return mixed
     */
    public function internalError($message = "Internal Error!"){

        return $this->failed($message,FoundationResponse::HTTP_INTERNAL_SERVER_ERROR);
    }

    /**
     * @param string $message
     * @return mixed
     */
    public function created($message = "created")
    {
        return $this->setStatusCode(FoundationResponse::HTTP_CREATED)
            ->message($message);

    }

    /**
     * @param $data
     * @param string $status
     * @return mixed
     */
    public function success($data, $status = "success"){

        return $this->status($status,compact('data'));
    }

    /**
     * @param string $message
     * @return mixed
     */
    public function notFond($message = 'Not Fond!')
    {
        return $this->failed($message,Foundationresponse::HTTP_NOT_FOUND);
    }
}

新建 Api 基类

app/Http/Controller/Api 目录下新建一个 Controller.php 作为 Api 专门的基类.
填入内容如下:

<?php

namespace App\Http\Controllers\Api;

use App\Api\Helpers\ApiResponse;
use App\Http\Controllers\Controller as BaseController;

class Controller extends BaseController
{

    use ApiResponse;
    // 其他通用的Api帮助函数
}

注意:其他 Api 控制器应该继承基类控制器

如何使用

得益于前面统一消息的封装,使用起来非常容易。
1. 返回正确信息

return $this->success('用户登录成功...');

2. 返回正确资源信息

return $this->success($user);

3. 返回自定义 http 状态码的正确信息

return $this->setStatusCode(201)->success('用户登录成功...');

4. 返回错误信息

return $this->failed('用户注册失败');

5. 返回自定义 http 状态码的错误信息

return $this->failed('用户登录失败',401);

6. 返回自定义 http 状态码的错误信息,同时也想返回自己内部定义的错误码

return $this->failed('用户登录失败',401,10001);

默认 success 返回的状态码是 200,failed 返回的状态码是 400

测试

让我们建一个Test控制器来测试一下:

<?php

namespace App\Http\Controllers\Api;

use App\Models\User;
use Illuminate\Http\Request;

class TestsController extends Controller
{
    public function test(){
        $user = User::query()->first();

        return $this->success($user);
    }
}

路由文件:

Route::get('tests','Api\TestsController@test');

测试结果:

封装统一的返回消息

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
lochpure
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~