【问题标题】:Laravel API resource hide keyLaravel API 资源隐藏键
【发布时间】:2020-03-30 05:02:21
【问题描述】:

我有一个名为 FilmResource 的 API 资源,我已将一个名为 is_new 的新属性附加到模型中,并且我已将此新属性添加到资源文件中,问题是我有两个端点可以使用这个 API 资源的属性,它返回了两者的属性,但我只希望它返回一个方法,有没有一种方法可以指定要在响应中返回的某些键?如果我使用 makeVisible 没有区别,因为它只来自 API 资源。

电影控制器

这是我希望它返回的方法,我有另一个类似的方法,但我不希望它返回。

public function show(string $id)
{
    $film = Film::findOrFail($id);

    return new FilmResource($film);
}

电影资源

  public function toArray($request)
    {
        return [
            'id' => $this->id,
            'description' => $this->description,
            'name' => $this->name,
            'is_new' => $this->is_new
}

API 资源是否会覆盖您在隐藏/可见数组中设置的属性?

当您在控制器中返回某个密钥时,您能否指定要从 API 资源中隐藏它?

【问题讨论】:

  • 您可以定义资源上的 api 响应。忘记可见和隐藏。在您的 FilmResource 上删除带有 is_new 的行,它将从您的回复中消失。
  • @EliasSoares 但是如果我希望它为一种方法响应而不是另一种方法响应返回呢?
  • 所以这取决于你的逻辑。您可以使用 $request 来识别要返回的内容(例如通过检查方法)或拥有两个不同的资源(扩展最完整的资源并删除不需要的字段,因此您不会重复代码。)
  • 您介意为我的案例发布一个示例吗?
  • 您控制该类,如果您想定义是否要传递该字段,或者您希望如何传递,请向构造函数添加另一个参数

标签: php laravel append jsonapi-resources


【解决方案1】:

让我举例说明如何使用两种不同的 api 资源来解决您的问题。

在本例中,在创建 Film(api store 方法)时,我们将显示所有字段,但在可视化(api show 方法)时,我们将仅显示几个字段:

namespace App\Http\Resources\Film;

use Illuminate\Http\Resources\Json\JsonResource;

class Store extends JsonResource {
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'description' => $this->description,
            'name' => $this->name,
            'is_new' => $this->is_new
        ];
    }
}

namespace App\Http\Resources\Film;

class Show extends Store {
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return Arr::except(
            parent::toArray($request),
            [
                'is_new'
            ]
        );
    }
}

请注意,我们是从最完整的响应写到不太完整的响应,所以我只有一个类具有关于如何输出数据的完整定义,而其他类通过删除一些字段来使用它(也可以这样做任何需要的转换)。

我建议的另一种方法是使用请求来了解要显示的内容,但我不喜欢这种解决方案,因为它没有完全解耦,您的资源需要了解您的路线,这不是他的工作 IMO。

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Film extends JsonResource {
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $data = [
            'id' => $this->id,
            'description' => $this->description,
            'name' => $this->name
        ];

        if ($request->isMethod('post')) {
            $data['is_new'] = $this->is_new;
        }

        return $data;
    }
}

我的示例中使用的逻辑只是示例,您可能需要适应自己的需求并创建自己的逻辑。

【讨论】:

  • 谢谢老兄,这对它的工作原理很有洞察力
猜你喜欢
  • 2020-05-21
  • 2016-10-15
  • 2020-06-13
  • 2020-03-23
  • 2012-03-21
  • 2012-06-09
  • 2010-10-20
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多