在控制器如何提前获得最终包裹后的结果?

我需要自定义返回格式,在控制器中生成资源对象后,若直接返回,返回给客户端的最终结果中,如果资源单个对象会以data包裹,如果资源是集合会有data,links, meta三项。现在我需要在不返回的情况下获得这最终的结果,然后以我的格式再返回。请问要如何操作?

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

可以通过如下方式实现,不过不建议这么做,建议还是通过框架提供的条件属性或者添加元数据等方式进行操作

public function index(Request $request)
{
    $posts = Post::paginate();

    $result_array = PostResource::collection($posts)->toResponse($request)->getData(true);
    // 自行处理 $result_array
    $result_array['new key'] = 'value';

    return $result_array;
}
5年前 评论
讨论数量: 6

可以通过如下方式实现,不过不建议这么做,建议还是通过框架提供的条件属性或者添加元数据等方式进行操作

public function index(Request $request)
{
    $posts = Post::paginate();

    $result_array = PostResource::collection($posts)->toResponse($request)->getData(true);
    // 自行处理 $result_array
    $result_array['new key'] = 'value';

    return $result_array;
}
5年前 评论

@FMW 其实我需要的最关键的就是这个getData()而已 :relaxed:

5年前 评论
$list = $product->paginate();
$data = $list->items();

其实这个$data就是你要的data了。

要自定义返回时这么做

        return ProductResource::collection(collect($list->items()))
            ->additional(getPaginateMeta($list));

那个getPaginateMeta()方法是helpers中自定义一个,返回你要的数组格式就好了
additional方法是api资源自带的方法。

5年前 评论

有没有优雅的方法在资源API资源中提前获得包裹后的结果 然后处理一下数据结构 最终返回呢

比如:

data:[{ id:1, name:aaa, age:18 },{ id:2, name:bbb, age:13 },{ id:3, name:ccc, age:19 } ]

我想要的是把这个变成

data:[ids:[1,2,3],names:[aaa,bbb,ccc],age:[18,13,19], datas:[{ id:1, name:aaa, age:18 },{ id:2, name:bbb, age:13 },{ id:3, name:ccc, age:19 } ]]

4年前 评论

$resource->response()->getData(true);

4年前 评论

好好看看文档,那个最佳答案我认为还不是最优雅的解决方式,Resource 这个资源类里面是支持闭包的,也就是说,你可以在Resource 这个资源类里面动态的按需加载你所需要的字段。

3年前 评论

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