【问题标题】:Laravel eloquent api resource remove `data` key (no collection)Laravel eloquent api 资源删除 `data` 键(无收集)
【发布时间】: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"
}

【问题讨论】:

    标签: laravel eloquent laravel-7


    【解决方案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.phpboot 方法内。

      【讨论】:

        【解决方案5】:

        这对我有用

        return UserResource::make($user)->toArray($request);
        

        用于收藏

        return UserResource::collection($users)->collection;
        

        【讨论】:

          猜你喜欢
          • 2020-06-25
          • 1970-01-01
          • 2023-03-12
          • 2021-07-15
          • 2020-01-29
          • 2020-01-05
          • 2020-04-22
          • 1970-01-01
          • 2020-03-30
          相关资源
          最近更新 更多