Laravel eloquent api 资源删除 `data` 键(无收集)
Posted
技术标签:
【中文标题】Laravel eloquent api 资源删除 `data` 键(无收集)【英文标题】:Laravel eloquent api resource remove `data` key (no collection) 【发布时间】:2020-07-04 21:25:43 【问题描述】:我有 user
的自定义 eloquent api 资源。例如当我使用这个资源时
代码
$user = $request->user();
return new UserResource($user);
然后我得到回应:
"data":
"name": "Margarete Daniel",
"email": "goldner.berniece@example.net",
"verified": "2020-03-20T07:15:56.000000Z"
如何更改 api 资源并获得示例响应:
"name": "Margarete Daniel",
"email": "goldner.berniece@example.net",
"verified": "2020-03-20T07:15:56.000000Z"
【问题讨论】:
【参考方案1】:将此添加到您的资源中
public static $wrap = null;
【讨论】:
这应该是公认的答案 - 这会禁用每个资源而不是整个应用程序的数据包装【参考方案2】:您可以通过在AppServiceProvider
中调用资源的withoutWrapping
静态方法来禁用数据包装。在您的情况下,它将是:
public function boot()
UserResource::withoutWrapping();
更多解释可以参考Laravel documentation about data wrapping。
【讨论】:
【参考方案3】:在我自己不断遇到同样的问题时回答。
在没有 data
包装的情况下返回 Laravel 资源的最简单方法是在 JSON 响应中简单地返回它。所以不要这样做:
return new UserResource($user);
你会这样做:
return response()->json(new UserResource($user));
这样,您也不必担心大量调用 withoutWrapping
方法来填充您的 AppServiceProvider
。
【讨论】:
为什么返回 JsonResponse 会删除包装?有文档链接吗? @rock3t 如果您手动将资源转换为 JsonResponse(如上面的示例),则 JsonResponse 假定资源中始终存在 $data 属性并像$resource->data
一样使用它。这就是为什么只有在资源自己翻译成响应时才会发生解包。即return new UserResource($user);
【参考方案4】:
要删除项目中所有资源的数据包装器,只需添加:
use Illuminate\Http\Resources\Json\JsonResource
public function boot()
JsonResource::withoutWrapping();
在AppServiceProvider.php
的boot
方法内。
【讨论】:
【参考方案5】:这对我有用
return UserResource::make($user)->toArray($request);
用于收藏
return UserResource::collection($users)->collection;
【讨论】:
以上是关于Laravel eloquent api 资源删除 `data` 键(无收集)的主要内容,如果未能解决你的问题,请参考以下文章
具有 Relation 和 Eloquent 的 Laravel Api 资源
Laravel:在 API 测试中使用 Eloquent 模型