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

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

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《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 里面统一格式即可

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年前 评论

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