3

我有一个名为 的 API 资源FilmResource,我已将一个新属性附加到名为的模型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 资源中隐藏密钥?

4

1 回答 1

1

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

在这个例子中,当创建一个电影(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;
    }
}

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

于 2019-12-05T10:14:46.930 回答