Coder Social home page Coder Social logo

jiannei / laravel-response Goto Github PK

View Code? Open in Web Editor NEW
229.0 3.0 29.0 203 KB

🤖 Provide a standardized and unified response data structure for Laravel and Lumen API projects. - 为 Laravel 和 Lumen API 项目提供一个规范统一的响应数据结构。

License: MIT License

PHP 100.00%
laravel-response response-formatter lumen-response

laravel-response's Introduction

laravel-response

简体中文 | ENGLISH

为 Laravel 和 Lumen API 项目提供一个规范统一的响应数据格式。

Test StyleCI Latest Stable Version Total Downloads Monthly Downloads License

社区讨论文章

介绍

laravel-response 主要用来统一 API 开发过程中「成功」、「失败」以及「异常」情况下的响应数据格式。

实现过程简单,在原有的 \Illuminate\Http\JsonResponse进行封装,使用时不需要有额外的心理负担。

遵循一定的规范,返回易于理解的 HTTP 状态码,并支持定义 ResponseEnum 来满足不同场景下返回描述性的业务操作码。

概览

  • 统一的数据响应格式,固定包含:codestatusdatamessageerror (响应格式设计源于:RESTful服务最佳实践 )
  • 你可以继续链式调用 JsonResponse 类中的所有 public 方法,比如 Response::success()->header('X-foo','bar');
  • 合理地返回 Http 状态码,默认为 restful 严格模式,可以配置异常时返回 200 http 状态码(多数项目会这样使用)
  • 支持格式化 Laravel 的 Api ResourceApi Resource CollectionPaginator(简单分页)、LengthAwarePaginator(普通分页)、Eloquent\ModelEloquent\Collection,以及简单的 arraystring等格式数据返回
  • 根据 debug 开关,合理返回异常信息、验证异常信息等
  • 支持修改 Laravel 特地异常的状态码或提示信息,比如将 No query results for model 的异常提示修改成 数据未找到
  • 支持配置返回字段是否显示,以及为她们设置别名,比如,将 message 别名设置为 msg,或者 分页数据第二层的 data 改成 list(res.data.data -> res.data.list)
  • 分页数据格式化后的结果与使用 league/fractal (DingoApi 使用该扩展进行数据转换)的 transformer 转换后的格式保持一致,也就是说,可以顺滑地从 Laravel Api Resource 切换到 league/fractal
  • 内置 Http 标准状态码支持,同时支持扩展 ResponseEnum 来根据不同业务模块定义响应码(可选,需要安装 jiannei/laravel-enum)
  • 响应码 code 对应描述信息 message 支持本地化,支持配置多语言(可选,需要安装 jiannei/laravel-enum)

安装

支持 Laravel 5.5.* ~ Laravel 11.* 版本,自定义业务操作码部分依赖于 jiannei/laravel-enum,需要先进行安装。

laravel 版本 lumen 版本 response 版本 enum 版本
5.5.* 5.5.* ~1.8 ~1.4
6.* 6.* ^2.0 ~1.4
7.* 7.* ^3.0 ^2.0
8.* 8.* ^4.0 ^3.0
9.* - 10.* 9.* - 10.* ^5.0 ^3.0
11.* 不支持 ^6.0 ^4.0
# laravel 5.5

composer require jiannei/laravel-response "~1.8" -vvv
composer require jiannei/laravel-enum "~1.4" -vvv # 可选

# laravel 6.x

composer require jiannei/laravel-response "^2.0" -vvv
composer require jiannei/laravel-enum "~1.4" -vvv # 可选

# laravel 7.x

composer require jiannei/laravel-response "^3.0" -vvv
composer require jiannei/laravel-enum "^2.0" -vvv # 可选

# laravel 8.x

composer require jiannei/laravel-response "^4.0" -vvv
composer require jiannei/laravel-enum "^3.0" -vvv # 可选

# laravel 9.x - 10.x

composer require jiannei/laravel-response "^5.0" -vvv
composer require jiannei/laravel-enum "^3.0" -vvv # 可选

# laravel 11.x

composer require jiannei/laravel-response "^6.0" -vvv
composer require jiannei/laravel-enum "^4.0" -vvv # 可选

配置

Laravel

  • 发布配置文件
$ php artisan vendor:publish --provider="Jiannei\Response\Laravel\Providers\LaravelServiceProvider"
  • 格式化异常响应(laravel 11 可省略这一步)
// app/Exceptions/Handler.php
// 引入以后对于 API 请求产生的异常都会进行格式化数据返回
// 要求请求头 header 中包含 /json 或 +json,如:Accept:application/json
// 或者是 ajax 请求,header 中包含 X-Requested-With:XMLHttpRequest;

<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Jiannei\Response\Laravel\Support\Traits\ExceptionTrait;

class Handler extends ExceptionHandler
{
    use ExceptionTrait;
    // ...
}

Lumen

  • 复制配置文件到 vendor/jiannei/laravel-response/config/response.php,到 config/response.php
cp vendor/jiannei/laravel-response/config/response.php config/response.php
  • 加载配置
// bootstrap/app.php
$app->configure('response');
  • 格式化异常响应

app/Exceptions/Handler.php 中 引入 use Jiannei\Response\Laravel\Support\Traits\ExceptionTrait;

app/Http/Controllers/Controller.php 中引入 use Jiannei\Response\Laravel\Support\Traits\ExceptionTrait;

  • 注册服务容器
$app->register(\Jiannei\Response\Laravel\Providers\LumenServiceProvider::class);

使用

扩展包本身提供了丰富的单元测试用例tests ,也可以通过查看测试用例来解锁使用方法。

或者查看相应的模板项目:

成功响应

示例代码

<?php
public function index()
{
    $users = User::all();

    return Response::success(new UserCollection($users));
}

public function paginate()
{
    $users = User::paginate(5);

    return Response::success(new UserCollection($users));
}

public function simplePaginate()
{
    $users = User::simplePaginate(5);

    return Response::success(new UserCollection($users));
}

public function item()
{
    $user = User::first();

    return Response::success(new UserResource($user));
}

public function array()
{
    return Response::success([
        'name' => 'Jiannel',
        'email' => '[email protected]'
    ],'', ResponseEnum::SERVICE_REGISTER_SUCCESS);
}

返回全部数据

支持自定义内层 data 字段名称,比如 rows、list

{
    "status": "success",
    "code": 200,
    "message": "操作成功",
    "data": {
        "data": [
            {
                "nickname": "Joaquin Ondricka",
                "email": "[email protected]"
            },
            {
                "nickname": "Jermain D'Amore",
                "email": "[email protected]"
            },
            {
                "nickname": "Erich Moore",
                "email": "[email protected]"
            }
        ]
    },
    "error": {}
}

分页数据

支持自定义内层 data 字段名称,比如 rows、list

{
    "status": "success",
    "code": 200,
    "message": "操作成功",
    "data": {
        "data": [
            {
                "nickname": "Joaquin Ondricka",
                "email": "[email protected]"
            },
            {
                "nickname": "Jermain D'Amore",
                "email": "[email protected]"
            },
            {
                "nickname": "Erich Moore",
                "email": "[email protected]"
            },
            {
                "nickname": "Eva Quitzon",
                "email": "[email protected]"
            },
            {
                "nickname": "Miss Gail Mitchell",
                "email": "[email protected]"
            }
        ],
        "meta": {
            "pagination": {
                "count": 5,
                "per_page": 5,
                "current_page": 1,
                "total": 12,
                "total_pages": 3,
                "links": {
                    "previous": null,
                    "next": "http://laravel-api.test/api/users/paginate?page=2"
                }
            }
        }
    },
    "error": {}
}

返回简单分页数据

支持自定义内层 data 字段名称,比如 rows、list

{
    "status": "success",
    "code": 200,
    "message": "操作成功",
    "data": {
        "data": [
            {
                "nickname": "Joaquin Ondricka",
                "email": "[email protected]"
            },
            {
                "nickname": "Jermain D'Amore",
                "email": "[email protected]"
            },
            {
                "nickname": "Erich Moore",
                "email": "[email protected]"
            },
            {
                "nickname": "Eva Quitzon",
                "email": "[email protected]"
            },
            {
                "nickname": "Miss Gail Mitchell",
                "email": "[email protected]"
            }
        ],
        "meta": {
            "pagination": {
                "count": 5,
                "per_page": 5,
                "current_page": 1,
                "links": {
                    "previous": null,
                    "next": "http://laravel-api.test/api/users/simple-paginate?page=2"
                }
            }
        }
    },
    "error": {}
}

返回单条数据

{
    "status": "success",
    "code": 200,
    "message": "操作成功",
    "data": {
        "nickname": "Joaquin Ondricka",
        "email": "[email protected]"
    },
    "error": {}
}

其他快捷方法

Response::ok();// 无需返回 data,只返回 message 情形的快捷方法
Response::localize(200101);// 无需返回 data,message 根据响应码配置返回的快捷方法
Response::accepted();
Response::created();
Response::noContent();

失败响应

不指定 message

public function fail()
{
    return Response::fail();
}
  • 未配置多语言响应描述
{
    "status": "fail",
    "code": 500,
    "message": "Http internal server error",
    "data": {},
    "error": {}
}
  • 配置多语言描述
{
    "status": "fail",
    "code": 500,
    "message": "操作失败",
    "data": {},
    "error": {}
}

指定 message

public function fail()
{
    return Response::fail('error');
}

返回数据

{
    "status": "fail",
    "code": 500,
    "message": "error",
    "data": {},
    "error": {}
}

指定 code

public function fail()
{
    return Response::fail('',ResponseEnum::SERVICE_LOGIN_ERROR);
}

返回数据

{
    "status": "fail",
    "code": 500102,
    "message": "登录失败",
    "data": {},
    "error": {}
}

其他快捷方法

Response::errorBadRequest();
Response::errorUnauthorized();
Response::errorForbidden();
Response::errorNotFound();
Response::errorMethodNotAllowed();
Response::errorInternal();

异常响应

表单验证异常

{
    "status": "error",
    "code": 422,
    "message": "验证失败",
    "data": {},
    "error": {
        "email": [
            "The email field is required."
        ]
    }
}

Controller 以外抛出异常

可以使用 abort 辅助函数抛出 HttpException 异常

abort(500102,'登录失败');

// 返回数据

{
    "status": "fail",
    "code": 500102,
    "message": "登录失败",
    "data": {},
    "error": {}
}

其他异常

开启 debug(APP_DEBUG=true

{
    "status": "error",
    "code": 404,
    "message": "Http not found",
    "data": {},
    "error": {
        "message": "",
        "exception": "Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException",
        "file": "/home/vagrant/code/laravel-api-starter/vendor/laravel/framework/src/Illuminate/Routing/AbstractRouteCollection.php",
        "line": 43,
        "trace": [
            {
                "file": "/home/vagrant/code/laravel-api-starter/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php",
                "line": 162,
                "function": "handleMatchedRoute",
                "class": "Illuminate\\Routing\\AbstractRouteCollection",
                "type": "->"
            },
            {
                "file": "/home/vagrant/code/laravel-api-starter/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
                "line": 646,
                "function": "match",
                "class": "Illuminate\\Routing\\RouteCollection",
                "type": "->"
            }
        ]
    }
}

关闭 debug

{
    "status": "error",
    "code": 404,
    "message": "Http not found",
    "data": {},
    "error": {}
}

自定义业务码

<?php
namespace App\Enums;

use Jiannei\Enum\Laravel\Support\Traits\EnumEnhance;

enum ResponseEnum: int
{
    use EnumEnhance;

    // 业务操作正确码:1xx、2xx、3xx 开头,后拼接 3 位
    // 200 + 001 => 200001,也就是有 001 ~ 999 个编号可以用来表示业务成功的情况,当然你可以根据实际需求继续增加位数,但必须要求是 200 开头
    // 举个栗子:你可以定义 001 ~ 099 表示系统状态;100 ~ 199 表示授权业务;200 ~ 299 表示用户业务...
    case SERVICE_REGISTER_SUCCESS = 200101;
    case SERVICE_LOGIN_SUCCESS = 200102;

    // 业务操作错误码(外部服务或内部服务调用...)
    case SERVICE_REGISTER_ERROR = 500101;
    case SERVICE_LOGIN_ERROR = 500102;

    // 客户端错误码:400 ~ 499 开头,后拼接 3 位
    case CLIENT_PARAMETER_ERROR = 400001;
    case CLIENT_CREATED_ERROR = 400002;
    case CLIENT_DELETED_ERROR = 400003;

    // 服务端操作错误码:500 ~ 599 开头,后拼接 3 位
    case SYSTEM_ERROR = 500001;
    case SYSTEM_UNAVAILABLE = 500002;
    case SYSTEM_CACHE_CONFIG_ERROR = 500003;
    case SYSTEM_CACHE_MISSED_ERROR = 500004;
    case SYSTEM_CONFIG_ERROR = 500005;
}

本地化业务码描述

<?php
// lang/zh_CN/enums.php
use App\Repositories\Enums\ResponseEnum;
use Jiannei\Enum\Laravel\Support\Enums\HttpStatusCode;

return [
    // 响应状态码
    ResponseEnum::class => [
        // 标准 HTTP 状态码
        HttpStatusCode::HTTP_OK->value => '操作成功',
        HttpStatusCode::HTTP_UNAUTHORIZED->value => '授权失败',

        // 业务操作成功
        ResponseEnum::SERVICE_REGISTER_SUCCESS->value => '注册成功',
        ResponseEnum::SERVICE_LOGIN_SUCCESS->value => '登录成功',

        // 业务操作失败:授权业务
        ResponseEnum::SERVICE_REGISTER_ERROR->value => '注册失败',
        ResponseEnum::SERVICE_LOGIN_ERROR->value => '登录失败',

        // 客户端错误
        ResponseEnum::CLIENT_PARAMETER_ERROR->value => '参数错误',
        ResponseEnum::CLIENT_CREATED_ERROR->value => '数据已存在',
        ResponseEnum::CLIENT_DELETED_ERROR->value => '数据不存在',

        // 服务端错误
        ResponseEnum::SYSTEM_ERROR->value => '服务器错误',
        ResponseEnum::SYSTEM_UNAVAILABLE->value => '服务器正在维护,暂不可用',
        ResponseEnum::SYSTEM_CACHE_CONFIG_ERROR->value => '缓存配置错误',
        ResponseEnum::SYSTEM_CACHE_MISSED_ERROR->value => '缓存未命中',
        ResponseEnum::SYSTEM_CONFIG_ERROR->value => '系统配置错误',
    ],
    ],
];

由 JetBrains 赞助

非常感谢 Jetbrains 为我提供的 IDE 开源许可,让我完成此项目和其他开源项目上的开发工作。

Stargazers over time

Stargazers over time

协议

MIT 许可证(MIT)。有关更多信息,请参见协议文件

laravel-response's People

Contributors

allcontributors[bot] avatar guanguans avatar jiannei avatar stylecibot avatar vanthao03596 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

laravel-response's Issues

返回的是空数组,但是data返回的是对象

后台写:

return Response::success([]);

API返回:

{
"status": "success",
"code": 200,
"message": "操作成功",
"data": {},
"error": {}
}

因为接口传的可能为空数组,期望返回格式:

{
"status": "success",
"code": 200,
"message": "操作成功",
"data": [],
"error": {}
}

建议更改:'data' => $data ?: is_array($data) ? $data: (object) $data,

laravel9表单验证时显示验证错误信息报错

  • Laravel Version: Laravel 9.6.0
  • PHP Version: 8.0.2
  • laravel-response Version: 4.0.0

错误描述:
表单验证不符合验证规则时,会出现以下错误:

{
    "status": "fail",
    "code": 500,
    "message": "Server Error",
    "data": {},
    "error": {
        "message": "Jiannei\\Response\\Laravel\\Response::fail(): Argument #2 ($code) must be of type int, array given, called in D:\\project\\example-app\\vendor\\laravel\\framework\\src\\Illuminate\\Support\\Facades\\Facade.php on line 337",
        "exception": "TypeError",
        "file": "D:\\project\\example-app\\vendor\\jiannei\\laravel-response\\src\\Response.php",
        "line": 158
    }
}

复现步骤:

  1. app/Exceptions/Handler.php 中引入 use Jiannei\Response\Laravel\Support\Traits\ExceptionTrait;
  2. 在方法中创建一个验证
use Illuminate\Http\Request;

public function test(Request $request){
    $validated =  $request->validate([
        'phone' => ['required']
    ]);
}

安装报错,laravel 版本7.30.1

HP Fatal error: Declaration of Jiannei\Enum\Laravel\Enum::castUsing(array $arguments) must be compatible with Illuminate\Contracts\Database\Eloquent\Castable::castUsing() in /home/vagrant/Code/new/vendor/jiannei/laravel-enum/src/Enum.php on line 26

In Enum.php line 26:

Declaration of Jiannei\Enum\Laravel\Enum::castUsing(array $arguments) must
be compatible with Illuminate\Contracts\Database\Eloquent\Castable::castUsi
ng()

Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 255

数据格式

return $this->formatDataFields([
'status' => $status,
'code' => $originalCode,
'message' => $message,
'data' => $data ?: (object) $data,
'error' => $errors ?: (object) [],
], Config::get('response.format.fields', []));

$data 与 $errors ,可以根据配置去转换数据类型。

最新5.0版本对Format进行重写拓展无法使用

按照已经关闭的issue,对Format进行重写扩展 并修改配置文件后无法正常访问

Target [Jiannei\Response\Laravel\Contracts\Format] is not instantiable while building [Jiannei\Response\Laravel\Response].

能力有限,翻看源码没找到原因,示例starter项目并未涉及到扩展Format,谢谢!

关于版本升级问题汇总

为了响应号召,最近做了些向下兼容 laravel 版本的改动,版本发布较为频繁。由于没有及时更新文档,给使用该扩展的朋友造成了些困扰,希望大家能够谅解。

可以将版本升级的问题汇总到这里(麻烦备注说明下使用的扩展版本号和 Laravel 版本号)

近期大版本发布说明:https://github.com/Jiannei/laravel-response/releases/tag/v4.0.0

完善了一些功能,并且支持了更多 Laravel 版本 🎉 🎉 🎉

# Feature

- [变更]:data 中包含多条数据返回时,原先的配置项 `format.paginated_resource.data_field`变更为`format.fields.data.fields.data.alias`。
- [新增]:新的文档站点 -> https://docs.sinan.fun/packages/laravel-response.html ❤️
- [新增]:返回数据结构中的全部字段 status、code、message、error、data,以及 data 里面包含的 data 和 meta 中的 pagination 字段,名称都支持别名方式修改,或设置隐藏不返回。
- [新增]:成功状态返回 增加 `ok` 方法,可以方便 `success` 方法中 data 必须传空的场景。#31 ([e840b3f](https://github.com/Jiannei/laravel-response/commit/e840b3f14fa6ec6d5598c045a3a8356e4ba8f6ba))
- [新增]:可以通过配置`exception`项,来覆盖异常**默认**的 code和message。比如,将`\Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class`异常的 message 设置为空字符串,来避免暴露数据模型信息。 #27 
- [新增]:同时支持 laravel 5.5、laravel 6.x、laravel 7.x,以及最新的 laravel 8.x ☺️
 

现已知的问题包含有:

  • ResourceCollection 结构缺少 data 层级问题:#56
  • JsonResource 响应类型判断条件问题:#59 (问题是由于原先 Laravel 8 安装的 1.* 的版本,composer update 无法直接升级到 4.* 版本导致,可以 composer remove 后重新安装解决)

可不可以提供一个特性 Traits

不知可否提供一个特性 Traits。我个人更喜欢 Traits 的方式 use 到 Controller 中去使用。

我目前的做法是这样的

/**
 * @method JsonResponse|JsonResource accepted($data = null, string $message = '', string $location = '')
 * @method JsonResponse|JsonResource created($data = null, string $message = '', string $location = '')
 * @method JsonResponse|JsonResource noContent(string $message = '')
 * @method JsonResponse|JsonResource localize(int $code = 200, array $headers = [], int $option = 0)
 * @method JsonResponse|JsonResource ok(string $message = '', int $code = 200, array $headers = [], int $option = 0)
 * @method JsonResponse|JsonResource success($data = null, string $message = '', int $code = 200, array $headers = [], int $option = 0)
 * @method JsonResponse|JsonResource errorBadRequest(?string $message = '')
 * @method JsonResponse|JsonResource errorUnauthorized(string $message = '')
 * @method JsonResponse|JsonResource errorForbidden(string $message = '')
 * @method JsonResponse|JsonResource errorNotFound(string $message = '')
 * @method JsonResponse|JsonResource errorMethodNotAllowed(string $message = '')
 * @method JsonResponse|JsonResource errorInternal(string $message = '')
 * @method JsonResponse fail(string $message = '', int $code = 500, $errors = null, array $header = [], int $options = 0)
 *
 * @see \Jiannei\Response\Laravel\Response
 */
class Controller extends BaseController
{
    public function __call($name, $arguments)
    {
        return app(Response::class)->{$name}(...$arguments);
    }
}

配置API限流,请求超过限制后, 响应方式为视图

laravel version: 10.28.0

大致配置:

config/response.php

....

    'exception' => [
        \Illuminate\Validation\ValidationException::class => [
            'code' => 422,
        ],
        \Illuminate\Auth\AuthenticationException::class => [

        ],
        \Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class =>[
            'message' => '',
        ],
        \Illuminate\Database\Eloquent\ModelNotFoundException::class => [
            'message' => '',
        ],
       // 在这里新增了一个API限流异常
        \Illuminate\Http\Exceptions\ThrottleRequestsException::class => [
            'code' => 429,
            'message' => 'Too Many Requests'
        ],
    ],

....

加了一个 Accept App\Http\Middleware\AcceptHeader.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class AcceptHeader
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        $request->headers->set('Accept', 'application/json');
        $request->headers->set('Content-Type', 'application/json');
        return $next($request);
    }
}


App\Http\Kernel.php

protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
           \App\Http\Middleware\AcceptHeader::class
            //\App\Http\Middleware\ListenerHttpRequest::class
        ],
    ];

然后看源码 怀疑还是 Accept没有生效?没办法,目前在App\Exceptions\Handle.php增加了一个 render方法

    public function render($request, Throwable $exception)
    {
//        if ($exception instanceof ThrottleRequestsException) {
//            return Response::fail($exception->getMessage(), 429);
//        }
         return $this->prepareJsonResponse($request, $exception);
    }

但是目前这样子的话。在访问API超过限制(1分钟5次请求) 后, 直接以浏览器方式请求的话 显示如下:
image

如果是用API工具发起请求。 会出现请求阻塞。一直到超过限流时间的同时获取到数据.....

辅助函数 abort 引入 报错

InvalidArgumentException: The HTTP status code "500102" is not valid. in file D:\phpstudy_pro\WWW\api\vendor\symfony\http-foundation\Response.php on line 469

响应字段的格式化的处理建议

关于响应字段的格式化的处理,个人觉得不够灵活。建议配置成一个回调类型由使用者去处理。

我想了下大致改成这样:

配置

https://github.com/jiannei/laravel-response/blob/main/config/response.php#L54

...
'format' => '`callable`'
...

格式化方法

https://github.com/jiannei/laravel-response/blob/main/src/Support/Traits/JsonResponseTrait.php#L241

    /**
     * Format response data fields.
     *
     * @param  array  $responseData
     * @return array
     */
    protected function formatDataFields(array $responseData): array
    {
        
        if (is_null($format = Config::get('response.format'))) {
            return $responseData;
        }
      
        // 处理回调(不太健全)
        return app()->call($format, [
             'responseData' => $responseData,
             'request' => request(),
       ]);
    }

无法静态调用

Laravel: 11
php: 8.3
laravel-response:6

是文档没有更新吗?无法像文档里面一样使用静态方法调用
use Jiannei\Response\Laravel\Response;
image
image
image

版本升级造成的 ResourceCollection 数据结构变更问题

每次升级的时候要考虑下对原有程序的影响范围,可以做好兼容或者有个明确的说明。
目前以为升级导致接口返回格式变化,直接导致测试全部挂掉2次了。如果没有测试,会直接导致前端应用全部失败。

第一次还能通过修改配置文件完成兼容,这次直接没法兼容了。
直接在返回结果中把 data 这层去掉,姑且不说哪种方式更合理,像这种大的结构性变动应该有个说明比较好吧。

// formatResourceCollectionResponse 
if ($resource->resource instanceof AbstractPaginator) {
            $paginated = $resource->resource->toArray();
            $paginationInformation = $this->formatPaginatedData($paginated);

            $data = array_merge_recursive(['data' => $resource->resolve(request())], $resource->with(request()), $resource->additional, $paginationInformation);
        } else {
            $data = array_merge_recursive($resource->resolve(request()), $resource->with(request()), $resource->additional);
        }

laravel8 异常响应无效

laravel8.*

在 app/Exceptions/Handler.php 中 引入 use Jiannei\Response\Laravel\Support\Traits\ExceptionTrait;

参数验证不通过 没有返回数据

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.