美文网首页
基于Laravel自定义trait实现统一API接口返回规范

基于Laravel自定义trait实现统一API接口返回规范

作者: liurongming | 来源:发表于2024-01-10 18:00 被阅读0次

一、效果展示

最终实现效果如下图所示:
支持i18n国际化数据返回,修改不同'locale' => 'zh_CN',返回中文
'locale' => 'en',返回英文。
当前使用版本:PHP Version 8.2.9 、Laravel10x。

image.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子目录


image.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;即可。

image.png
【需要安装laravel-lang】国际化支持。
image.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。

image.png

相关文章

网友评论

      本文标题:基于Laravel自定义trait实现统一API接口返回规范

      本文链接:https://www.haomeiwen.com/subject/fiyzndtx.html