资源响应没有用“数据”包装[重复]

Posted

技术标签:

【中文标题】资源响应没有用“数据”包装[重复]【英文标题】:Resource response is not wrapped with "data" [duplicate] 【发布时间】:2020-05-18 12:43:20 【问题描述】:

我很好奇,为什么我的资源响应没有包裹在data

这是我的资源:

App\Http\Resources\CategoryResource Object
(
    [resource] => stdClass Object
        (
            [id] => 12
            [title] => Category
            [description] => <p>Test</p>

    [with] => Array
        (
        )

    [additional] => Array
        (
        )

)

一旦这个资源像这样返回:

$response = $this->client->getApiResponse('/api/category/'.$id); //response comes from third-party-API
$data = new CategoryResource(json_decode ($response->getContents())->data);

return response()->json($data);

输出是


  "id": 12,
  "title": "Category",
  "description": "<p>Test</p>"

但根据https://laravel.com/docs/5.8/eloquent-resources#data-wrapping 应该是:


  "data": 
    "id": 12,
    "title": "Category",
    "description": "<p>Test</p>"
  

为什么这里缺少data-wrapper?

【问题讨论】:

【参考方案1】:

数据包装器仅适用于资源收集。如我所见,您没有资源集合。资源集合用于返回结果集合。您正在返回单个类别。所以你应该使用 ResourceCollection 或手动包装它。

看到这个:https://laravel.com/docs/5.8/eloquent-resources#writing-resources

希望对你有帮助

【讨论】:

实际上,当您直接从路由或控制器返回 ModelResource 而不是用 response() 包装它时,它会正确包装它。 正如@reppair 所说,response() 删除包装,返回资源工作正常。有人知道为什么吗? 当你直接从控制器返回 SomeResource 时,Laravel 会调用 toResponse 来获得响应。如果您查看toResponse 方法,它使用toArray 获取数组,然后用dataNo Matter What 包装它。当您返回 response(SomeResoure) 时,它会调用 toArray 并返回 json_encode(result_of_toArray),而不进行包装。如果您想直接从Controller 返回未包装的资源,您可以使用以下语法:SomeResource::collection($data)-&gt;toArray(request())。它将返回未包装的数组。

以上是关于资源响应没有用“数据”包装[重复]的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:Python.h:没有这样的文件或目录 - 没有用 python-devel 解决 [重复]

当响应包含在数组中时,RestKit POSTed 托管对象变得重复

Node GraphQL从API解析空数据[重复]

访问捆绑包上的资源[重复]

为啥java的一些概念需要使用包装类而不是原始数据类型[重复]

ORACLE删除表中重复数据