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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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'];

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

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

6年前 评论

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

6年前 评论
风吹枫落

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

6年前 评论
liyu001989

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

6年前 评论

手动封装一个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
    }
}
6年前 评论

跟我司的需求一样,我司的需求是不管成功失败,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'];

5年前 评论
h-o-o 3年前
aen233 (作者) 3年前
周小云 3个月前

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

3年前 评论

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