当前位置: 首页 > news >正文

Laravel Trait 实现 统一JSON 响应格式

首先什么是 Trait ?

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

Trait 基本概念

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

trait Loggable {
    public function log($message) {
        echo "Log: $message\n";
    }
}

Trait 的特点

  • 不是类:不能实例化

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

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

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

Trait的 使用 ,Use 即可

class User {
    use Loggable ;
}

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

多个 Trait 使用


class MyClass {
    use TraitA, TraitB;
}

当多个 Trait 有同名方法时

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 方法重命名
    }
}

Trait 与继承的优先级

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

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

  2. 其次是Trait 中的方法

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

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

Laravel 开发统一的 JSON 响应格式,用来做Api响应。

直接上源码:

<?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);
    }
}

Api接口直接使用

class TestController extends Controller
{
    use ResponseJson;

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

代码分析

  1. 封装了成功和错误和自定义的响应方法,success ,error,autoResponse
  2. 支持自定义 HTTP 状态码和 headers
  3. success ,error 保持一致的参数顺序 (消息 -> 数据/代码 -> headers -> HTTP状态码),使用的时候尽量减少干扰
  4. 区分业务编码 code 和 HTTP 状态码 httpStatus,一个是业务上的区分,一个是接口通信上的状态。
  5. 增强的 autoResponse 方法,处理自定义的相关情况
  6. 严格的参数类型声明和验证
  7. 灵活性、可维护性和类型安全性

相关文章:

  • CSS定位
  • 观察者模式在Java微服务间的使用
  • 学习大模型需要具备哪些技术、知识和基础
  • 【蓝桥杯速成】| 17.完全背包(一维easy版)
  • 题解:P8667 [蓝桥杯 2018 省 B] 递增三元组 (暴力+二分)
  • DeepSeek原生稀疏注意力(Native Sparse Attention, NSA)算法介绍
  • 【SpringCloud】LoadBalance-负载均衡
  • html处理Base文件流
  • 【C++项目】从零实现RPC框架「三」:项⽬抽象层实现
  • 动手实现docker全过程
  • python求解非线性方程组
  • 蓝桥杯——统计子矩阵
  • 设计模式学习(1)
  • 顺据结构(C\C++)——双向链表
  • 【Qt】游戏场景和图元
  • rbpf虚拟机-JIT和解释执行对比
  • 数据处理的两种范式:深入解析OLTP与OLAP系统
  • 自动驾驶实验
  • 13届省赛python A组:10.数的拆分
  • 【Linux】进程间通信(IPC)-- 无名管道、命名管道
  • 如何在电脑上做物流网站/网站推广线上推广
  • 日本做外贸网站设计/百度网站域名
  • 怎么登录企业邮箱/seo是什么岗位简称
  • jsp和php哪个做网站快/百度竞价排名广告
  • 济南360做网站电话/南昌seo排名扣费
  • Wordpress表单无法收到/企业网站优化解决方案