你们有没有什么比较好的办法统一api response

这里面主要的一个问题是使用了Resource的情况,并且有分页
如果使用additional增加code和message会加到尾部,好像没有办法加到前面,而且我想把所有的数据都放在data,目前如果用additional会把分页相关的信息和data放同一个层

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8
JaguarJack

不清楚是不是要这个

 // 响应
 RequestHandled::class => [ // 这是框架自带的事件
     RequestHandledListener::class,
 ],

处理 RequestHandledListener,通过这个可以拦截响应的 Data,这里可以封装统一返回格式,任意格式

public function handle(RequestHandled $event): void
    {
        $response = $event->response;

        if ($response instanceof JsonResponse) {
            $exception = $response->exception;

            if ($response->getStatusCode() == SymfonyResponse::HTTP_OK && ! $exception) {
                $response->setData($this->formatData($response->getData()));
            }
        }
    }

在控制器直接 return 就行了


class TestController
{

    public function index()
    {
        return "Hello this is test method";
    }
}

控制器只返回 Data,然后整个 json 响应数据在 Listener 里面统一格式即可

2年前 评论

类似于 dingo api

2年前 评论
sanders

我们一般很少用 additional 添加 code 和 message 这类信息,因为一般正常的 code 内容一致,一般会随异常的抛出进行渲染,这是在 App\Exceptions\Handler 里面注册 renderable 来实现的。

我们也不在乎最终输出的 JSON 对象属性顺序,毕竟接口的调用方也是程序不会在意属性返回的顺序,JSON 文档不读取完整是不会进行解析的。

如果你使用 Resource 的 collection() 方法处理 Illuminate\Contracts\Pagination\LengthAwarePaginator 返回值中分页信息应在 data.meta 属性中,与列表的 data.data 是分离的。你也可以使用中间件或 wrap 属性等方式自定义返回格式。

        return  CategoryResource::collection(
            $service->handle($options)
                ->paginate(
                    perPage: request('per_page', 15),
                    columns: ['id','name','parent_id','created_at','updated_at'],
                )
        );
2年前 评论
深蓝色 (楼主) 2年前
sanders (作者) 2年前
trait ShowMessage
{
    public $response = [];

    public function showSuccess($msg,$data=null): JsonResponse
    {
        return $this->showInfo(200, $msg, $data);
    }

    public function showError($msg): JsonResponse
    {
        return $this->showInfo(422, $msg, null);
    }

    public function showJson($code, $msg, $data=null): JsonResponse
    {
        return $this->showInfo($code, $msg, $data);
    }

    protected function showInfo($code, $msg, $data): JsonResponse
    {
        if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && extension_loaded('zlib')  && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) {
            ob_start('ob_gzhandler');
        }

        //header('Content-Type:application/json;charset=utf-8');
        $response = [
            'code' => $code,
            'msg' => $msg,
            'result' => $data,
        ];

        $this->response = $response;

        return response()->json($response);

    }
}
2年前 评论

不知道这个是不是你想要的 github.com/alicfeng/api-response

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!