资源响应没有用“数据”包装[重复]
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
获取数组,然后用data
键No Matter What 包装它。当您返回 response(SomeResoure)
时,它会调用 toArray
并返回 json_encode(result_of_toArray)
,而不进行包装。如果您想直接从Controller
返回未包装的资源,您可以使用以下语法:SomeResource::collection($data)->toArray(request())
。它将返回未包装的数组。以上是关于资源响应没有用“数据”包装[重复]的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:Python.h:没有这样的文件或目录 - 没有用 python-devel 解决 [重复]
当响应包含在数组中时,RestKit POSTed 托管对象变得重复