本书未发布
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');
测试结果: