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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 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 里面统一格式即可

11个月前 评论

类似于 dingo api

11个月前 评论
sanders

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

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

如果你使用 Resourcecollection() 方法处理 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'],
                )
        );
11个月前 评论
深蓝色 (楼主) 11个月前
sanders (作者) 11个月前
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);

    }
}
11个月前 评论

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

11个月前 评论

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