Laravel API 资源隐藏键

Laravel API resource hide key

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

电影控制器

这是我想要的方法return,我有另一种类似的方法,但我不想要它return。

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 资源是否会覆盖您在 hidden/visible 数组中设置的属性?

当您在控制器中 return 时,您能否指定要从 API 资源中隐藏密钥?

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

在这个例子中,当创建一个电影(api 存储方法)时,我们将显示所有字段,但在可视化时(api 显示方法)我们将只显示几个字段:

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'
            ]
        );
    }
}

请注意,我们是从最完整的回复到不太完整的回复,所以我只有一个 class 具有关于如何输出数据的完整定义,其他 classes通过删除一些字段来使用它(也可以进行任何所需的转换)。

我建议的另一种方法是使用请求来了解要显示的内容,但我不喜欢这个解决方案,因为它没有完全分离,你的资源需要知道你的路线,这不是他的工作 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;
    }
}

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