【问题标题】: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?

【问题讨论】:

    标签: laravel laravel-6 laravel-6.2 laravel-resource


    【解决方案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())。它将返回未包装的数组。
    猜你喜欢
    • 2017-07-22
    • 2019-02-04
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多