Laravel Trait 实现 统一JSON 响应格式

什么是 Trait ?

Trait 是 PHP 5.4 引入的一个代码复用机制,它解决了 PHP 单继承的限制问题。

1.Trait 基本概念

Trait 是一种代码复用机制,即可以理解为 可重用的方法集合

php 复制代码
trait Loggable {
    public function log($message) {
        echo "Log: $message\n";
    }
}

2.Trait 的特点

  • 不是类:不能实例化

  • 不是接口:可以包含具体实现

  • 解决单继承限制:一个类可以使用多个 Trait,这是重点,因为PHP只能单继承,很好弥补了这一弱势。

  • 代码复用:可以理解为帮助方法,多个类使用,不用重复多次写

3.Trait的 使用 ,Use 即可

php 复制代码
class User {
    use Loggable ;
}

//laravel 常见的伪删除,等等
class User extends Model {
    use SoftDeletes; // 软删除功能
}

4.多个 Trait 使用

php 复制代码
class MyClass {
    use TraitA, TraitB;
}

5.当多个 Trait 有同名方法时

php 复制代码
trait A {
    public function conflict() { echo "A"; }
}
trait B {
    public function conflict() { echo "B"; }
}
class MyClass {
    use A, B {
        A::conflict insteadof B;  // 使用 A 的 conflict 方法
        B::conflict as conflictB; // 将 B 的 conflict 方法重命名
    }
}

6.Trait 与继承的优先级

方法解析优先级(从高到低):

  1. 当前类中的方法权重最高

  2. 其次是Trait 中的方法

  3. 最后继承的父类中的方法

Trait 还有一些其他的特性 等等,大家去看看语法。重点来了

统一JSON 响应类开放。

直接上源码:

php 复制代码
<?php
namespace App\Http\Trait;

use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Response;

trait ResponseJson
{
    /**
     * 默认成功状态码
     */
    protected int $successCode = 200;

    /**
     * 默认错误状态码
     */
    protected int $errorCode = 101;

    /**
     * 返回成功 JSON 响应
     *
     * @param string $message 成功消息
     * @param mixed $data 返回数据
     * @param array $headers 附加头信息
     * @param int $httpStatus HTTP 状态码
     * @return JsonResponse
     */
    public function success(
        string $message,
        mixed  $data = [],
        array  $headers = [],
        int    $httpStatus = 200
    ): JsonResponse
    {
        return Response::json([
            'code' => $this->successCode,
            'message' => $message,
            'data' => $data,
        ], $httpStatus, $headers);
    }

    /**
     * 返回错误 JSON 响应
     *
     * @param string $message 错误消息
     * @param int|null $code 业务错误码
     * @param mixed $data 附加数据
     * @param array $headers 附加头信息
     * @param int $httpStatus HTTP 状态码
     * @return JsonResponse
     */
    public function error(
        string $message,
        int    $code = NULL,
        mixed  $data = [],
        array  $headers = [],
        int    $httpStatus = 400
    ): JsonResponse
    {
        return Response::json([
            'code' => $code ?? $this->errorCode,
            'message' => $message,
            'data' => $data,
        ], $httpStatus, $headers);
    }

    /**
     * 根据数据自动返回成功或错误响应
     *
     * @param array $responseData 必须包含 code, message, data
     * @param array $headers 附加头信息
     * @return JsonResponse
     */
    public function autoResponse(array $responseData, array $headers = []): JsonResponse
    {
        if(!isset($responseData['code'], $responseData['message'])){
            return $this->error('Invalid response format', 500, [], $headers, 500);
        }

        return $responseData['code'] === $this->successCode
            ? $this->success($responseData['message'], $responseData['data'] ?? [], $headers)
            : $this->error($responseData['message'], $responseData['code'], $responseData['data'] ?? [], $headers);
    }
}

1. Api接口直接使用

php 复制代码
class TestController extends Controller
{
    use ResponseJson;

    public function index()
    {
        //return $this->success('success', [1, 2, 3]);
        return $this->error('error', 11, [1, 2, 3]);
    }
}

2.代码分析

  1. 封装了成功和错误和自定义的响应方法,success ,error,autoResponse
  2. 支持自定义 HTTP 状态码和 headers
  3. success ,error 保持一致的参数顺序 (消息 -> 数据/代码 -> headers -> HTTP状态码),使用的时候尽量减少干扰
  4. 区分业务编码 code 和 HTTP 状态码 httpStatus,一个是业务上的区分,一个是接口通信上的状态。
  5. 增强的 autoResponse 方法,处理自定义的相关情况
  6. 严格的参数类型声明和验证
  7. 灵活性、可维护性和类型安全性
相关推荐
JaguarJack3 天前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
后端·php·laravel·服务端
魔众4 天前
ModStartBlog v11.3.0 安全加固、体验优化,自动化测试更强大
开源·php·laravel
AI情绪识别开源10 天前
HFpEF 心房-心室耦联效率无创监测方向(AVCEI)
typescript·laravel·perl
catchadmin12 天前
用 Jev 与 Laravel AI SDK 检测垃圾邮件和自动回复
数据库·人工智能·laravel
BingoGo16 天前
用 Jev 与 Laravel AI SDK 检测垃圾邮件和自动回复
后端·laravel
JaguarJack16 天前
用 Jev 与 Laravel AI SDK 检测垃圾邮件和自动回复
后端·ai·php·laravel·服务端
右耳朵猫AI25 天前
PHP周刊2026W38 | Laravel AI可观测、Symfony三版本、Webhook零信任、事件溯源架构
后端·php·laravel
右耳朵猫AI1 个月前
PHP周刊2026W37 | Symfony 三维护版齐发、Laravel AI SDK 0.11、LSP 服务器上线
后端·php·laravel
右耳朵猫AI1 个月前
PHP周刊2026W36 | Laravel AI SDK 0.11可观测、Symfony 8.1.5、Octane并发、事件溯源
人工智能·php·laravel
JaguarJack1 个月前
现在就值得尝试的 5 个 Laravel 新包
后端·php·laravel·服务端