一、效果展示
最终实现效果如下图所示:
支持i18n国际化数据返回,修改不同'locale' => 'zh_CN',
返回中文
'locale' => 'en',
返回英文。
当前使用版本:PHP Version 8.2.9 、Laravel10x。
![](https://img.haomeiwen.com/i5287237/7d3da339cddd85f5.png)
- 有数据返回:
public function token(Request $request)
{
$request->validate([
'name' => 'required',
'password' => 'required',
'device_name' => 'required',
]);
$user = User::where('name', $request->name)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['用户名或密码不正确!'],
]);
}
return $this->success(["token" => $user->createToken($request->device_name)->plainTextToken]);
}
{
"code": 200,
"message": "请求成功",
"data": {
"token": "49|SpUVNfkiPQhd8aY2BffAGNmN8e8ywMtHw9L0k2I97c7bf39a"
}
}
public function show(Request $request)
{
return $this->success(['user' => User::all()]);
}
{
"code": 200,
"message": "请求成功",
"data": {
"user": [
{
"id": 1,
"name": "admin",
"email": "admin@qq.com",
"email_verified_at": null,
"created_at": null,
"updated_at": null
}
]
}
}
- 无需数据返回
public function index()
{
return $this->ok();
}
{
"code": 200,
"message": "请求成功"
}
二、实现参考
在app目录下,新建\Helpers\Api子目录
![](https://img.haomeiwen.com/i5287237/c84c89744dad9a3d.png)
代码实现如下,
<?php
namespace App\Helpers\Api;
use Illuminate\Http\Response as FoundationResponse;
trait ApiResponse
{
protected $statusCode = FoundationResponse::HTTP_OK;
/**
* @return mixed
*/
public function getStatusCode()
{
return $this->statusCode;
}
/**
* @param $statusCode
* @return $this
*/
public function setStatusCode($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 string $message
* @param array $data
* @param $code
* @return mixed
*/
private function makeDataAndRespond(array $data, string $message, $code = 200)
{
$this->setStatusCode($code ?? 200);
$arrData = [
'code' => $this->statusCode,
'message' => $message
];
$ret = array_merge($arrData, ["data" => $data]);
return $this->respond($ret);
}
/**
* 仅发送消息
* @param string $message
* @param $code
* @return mixed
*/
public function message(string $message, $code = 200)
{
$this->setStatusCode($code ?? 200);
$arrData = [
'code' => $this->statusCode,
'message' => $message
];
return $this->respond($arrData);
}
/**
* 返回成功
* http_status始终为200
* code可以修改
* 不带data参数
* @param string|NULL $message
* @param $code
* @return mixed
*/
public function ok(string $message = NULL, $code = 200)
{
$this->setStatusCode(200);
$arrData = [
'code' => $code ?? 200,
'message' => $message ?? __("http-statuses.200")
];
return $this->respond($arrData);
}
/**
* 发送数据
* @param array $data
* @param string|NULL $message
* @return mixed
*/
public function success(array $data, string $message = NULL)
{
$code = FoundationResponse::HTTP_OK;
return $this->makeDataAndRespond($data, $message ?? __("http-statuses." . $code));
}
/**
* 发送失败消息
* @param $message
* @param $code
* @return mixed
*/
public function failed(string $message = NULL, $code = FoundationResponse::HTTP_BAD_REQUEST)
{
return $this->message($message ?? __("http-statuses." . $code), $code);
}
/**
* 已创建
* @param string|NULL $message
* @return mixed
*/
public function created(string $message = NULL)
{
return $this->failed($message, FoundationResponse::HTTP_CREATED);
}
public function locked(string $message = NULL)
{
return $this->failed($message, FoundationResponse::HTTP_LOCKED);
}
/**
* 内部错误
* @param string|NULL $message
* @return mixed
*/
public function internalError(string $message = NULL)
{
return $this->failed($message, FoundationResponse::HTTP_INTERNAL_SERVER_ERROR);
}
/**
* 未找到
* @param string|null $message
* @return mixed
*/
public function notFound(string $message = null)
{
return $this->failed($message, Foundationresponse::HTTP_NOT_FOUND);
}
/**
* 禁止访问
* @param string|NULL $message
* @return mixed
*/
public function forbidden(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_FORBIDDEN);
}
/**
* 无内容
* @param string|NULL $message
* @return mixed
*/
public function noContent(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_NO_CONTENT);
}
/**
* 未认证
* @param string|NULL $message
* @return mixed
*/
public function unauthorized(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_UNAUTHORIZED);
}
/**
* 网关错误
* @param string|NULL $message
* @return mixed
*/
public function badGateway(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_BAD_GATEWAY);
}
/**
* 未知错误
* @param string|NULL $message
* @return mixed
*/
public function unknownError(string $message = NULL)
{
return $this->failed($message, 520);
}
/**
* 版本不支持
* @param string|NULL $message
* @return mixed
*/
public function versionNotSupported(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_VERSION_NOT_SUPPORTED);
}
/**
* 连接超时
* @param string|NULL $message
* @return mixed
*/
public function connectionTimedOut(string $message = NULL)
{
return $this->failed($message, 522);
}
/**
* 已存在
* @param string|NULL $message
* @return mixed
*/
public function found(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_FOUND);
}
/**
* 已冲突
* @param string|NULL $message
* @return mixed
*/
public function conflict(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_CONFLICT);
}
/**
* 已不可用
* @param string|NULL $message
* @return mixed
*/
public function gone(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_GONE);
}
/**
* 已接受
* @param string|NULL $message
* @return mixed
*/
public function accepted(string $message = NULL)
{
return $this->failed($message, Foundationresponse::HTTP_ACCEPTED);
}
}
三、使用
在控制器类中,使用use ApiResponse;
即可。
![](https://img.haomeiwen.com/i5287237/9d0b2d884aa584c1.png)
【需要安装
laravel-lang
】国际化支持。![](https://img.haomeiwen.com/i5287237/70c7a97196b9572b.png)
<?php
namespace App\Http\Controllers;
use App\Helpers\Api\ApiResponse;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
class UserController extends Controller
{
use ApiResponse;
public function index()
{
return $this->ok();
}
public function show(Request $request)
{
return $this->success(['user' => User::all()]);
}
public function token(Request $request)
{
$request->validate([
'name' => 'required',
'password' => 'required',
'device_name' => 'required',
]);
$user = User::where('name', $request->name)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['用户名或密码不正确!'],
]);
}
return $this->success(["token" => $user->createToken($request->device_name)->plainTextToken]);
}
}
备注:Postman接口设置X-Requested-With=XMLHttpRequest
有利于调试,并且有异常都通过接口统一返回。Laravel整体使用非常Nice。
![](https://img.haomeiwen.com/i5287237/e00f3f17599e3175.png)
网友评论