正确响应,也想在 response 时加入 code 字段,应该如何修改?

错误的时候,可以通过 HttpException,在返回错误信息中添加 code 字段。
如果是请求正确,我也想返回 code 字段,此时应该如何修改?我百度找了一下没有提及

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 11

跟我司的需求一样,我司的需求是不管成功失败,http_status 都是 200,一定要返回 code 和 message,成功 code 返回 0,失败 code 返回自定义 code 码。
然后我们的做法是异常建了一个异常类,laravel5.5 可以直接在自建的异常类渲染,就直接返回 code 和 message 了。
正确相应是,新建了一个 SuccessResource,在该 SuccessResource 中返回 code 和 message,

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class Success extends Resource
{
    /**
     * @var array
     */
    protected $data;
    /**
     * 禁用顶层包裹
     *
     * @var null
     */
    public static $wrap = null;

    public function __construct($data = [], $resource = null)
    {
        $this->data = $data;

        if (is_null($resource)) {
            $resource = collect();
        }
        parent::__construct($resource);
    }

    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     *
     * @return array
     */
    public function toArray($request)
    {
        $success         = ['code' => 0, 'message' => 'success'];
        $success['data'] = array_has($this->data, 'data') ? $this->data['data'] : $this->data;

        if (array_has($this->data, 'meta')) {
            $success['meta'] = $this->data['meta'];
        }

        return $success;
    }
}

再在 helpers 中写一个 success () 方法,返回 SuccessResource。

if (!function_exists('success')) {
    function success($data = [])
    {
        return new \App\Http\Resources\Success($data);
    }
}

当然正确相应也分情况,操作成功是 return success ().
带有参数是 return success ($data);
用的 laravel5.5 + 的 apiResource,新建 BaseResource,添加 public $additional = ['code'=>0,'message'=>'success'];

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

abstract class BaseResource extends Resource
{
    /**
     * 成功返回添加code码
     * @var array
     */
    public $additional = [
        'code'=>0,
        'message'=>'success'
    ];

其他资源类继承该类,这样返回详情时 return new UserResource ($user); 会带 code 和 message。
列表和分页,我司的要求是返回 code、message、data、meta,meta 中是 4 个值,这样 meta 是要自己重新封装的,在封装 meta 时,将 code 和 message 一起写上就可以。
在 helpers 中封装 meta:

if (!function_exists('getPaginateMeta')) {
    function getPaginateMeta($obj)
    {
        return [
            'meta'    => [
                'total'        => $obj->total(),
                'per_page'     => (int)$obj->perPage(),
                'current_page' => $obj->currentPage(),
                'last_page'    => $obj->lastPage()
            ],
            'code'    => 0,
            'message' => 'success'
        ];
    }
}

然后返回分页写法是

return UserResource::collection(collect($index->items())) ->additional(getPaginateMeta($index));

当然最简单,也最不依赖,就是直接返回数组啦,return ['code'=>0,'message'=>'success'];

6年前 评论
h-o-o 5年前
aen233 (作者) 5年前
周小云 1年前
风吹枫落

可以选择手写或者包装一个 trait

7年前 评论

@风吹枫落 不会改。。。所以发出来请教

7年前 评论
风吹枫落

@XYD 介绍 看看这个能满足不

7年前 评论
liyu001989

REST 风格的接口,通过状态码判断就行,不建议在每个 body 中增加 code

7年前 评论

手动封装一个 trait 或可以考虑使用 Resources

return (new CateCollection($this->cate->page($page, $page_size, $query)->load('items')))->additional(['meta' => compact('total_nums', 'page_size', 'page')]);

得到结果

{
    title: {
        id: "序号",
        cate_name: "分类名",
        item_nums: "文章数",
        status: "显示",
        created_at: "创建时间",
        updated_at: "修改时间"
    },
    data: [
        {
            id: 1,
            cate_name: "测试一",
            status: true,
            item_nums: 8,
            created_at: "1 month ago",
            updated_at: "2018-03-01 06:27:58"
        }
    ],
    meta: {
        total_nums: 4,
        page_size: 1,
        page: 1
    }
}
7年前 评论

跟我司的需求一样,我司的需求是不管成功失败,http_status 都是 200,一定要返回 code 和 message,成功 code 返回 0,失败 code 返回自定义 code 码。
然后我们的做法是异常建了一个异常类,laravel5.5 可以直接在自建的异常类渲染,就直接返回 code 和 message 了。
正确相应是,新建了一个 SuccessResource,在该 SuccessResource 中返回 code 和 message,

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class Success extends Resource
{
    /**
     * @var array
     */
    protected $data;
    /**
     * 禁用顶层包裹
     *
     * @var null
     */
    public static $wrap = null;

    public function __construct($data = [], $resource = null)
    {
        $this->data = $data;

        if (is_null($resource)) {
            $resource = collect();
        }
        parent::__construct($resource);
    }

    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     *
     * @return array
     */
    public function toArray($request)
    {
        $success         = ['code' => 0, 'message' => 'success'];
        $success['data'] = array_has($this->data, 'data') ? $this->data['data'] : $this->data;

        if (array_has($this->data, 'meta')) {
            $success['meta'] = $this->data['meta'];
        }

        return $success;
    }
}

再在 helpers 中写一个 success () 方法,返回 SuccessResource。

if (!function_exists('success')) {
    function success($data = [])
    {
        return new \App\Http\Resources\Success($data);
    }
}

当然正确相应也分情况,操作成功是 return success ().
带有参数是 return success ($data);
用的 laravel5.5 + 的 apiResource,新建 BaseResource,添加 public $additional = ['code'=>0,'message'=>'success'];

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

abstract class BaseResource extends Resource
{
    /**
     * 成功返回添加code码
     * @var array
     */
    public $additional = [
        'code'=>0,
        'message'=>'success'
    ];

其他资源类继承该类,这样返回详情时 return new UserResource ($user); 会带 code 和 message。
列表和分页,我司的要求是返回 code、message、data、meta,meta 中是 4 个值,这样 meta 是要自己重新封装的,在封装 meta 时,将 code 和 message 一起写上就可以。
在 helpers 中封装 meta:

if (!function_exists('getPaginateMeta')) {
    function getPaginateMeta($obj)
    {
        return [
            'meta'    => [
                'total'        => $obj->total(),
                'per_page'     => (int)$obj->perPage(),
                'current_page' => $obj->currentPage(),
                'last_page'    => $obj->lastPage()
            ],
            'code'    => 0,
            'message' => 'success'
        ];
    }
}

然后返回分页写法是

return UserResource::collection(collect($index->items())) ->additional(getPaginateMeta($index));

当然最简单,也最不依赖,就是直接返回数组啦,return ['code'=>0,'message'=>'success'];

6年前 评论
h-o-o 5年前
aen233 (作者) 5年前
周小云 1年前

return response ()->json ($content, 200); 这样就行了

4年前 评论