Laravel API 资源隐藏键

Posted

技术标签:

【中文标题】Laravel API 资源隐藏键【英文标题】:Laravel API resource hide key 【发布时间】: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 来识别要返回的内容(例如通过检查方法)或拥有两个不同的资源(扩展最完整的资源并删除不需要的字段,因此您不会重复代码。) 您介意为我的案例发布一个示例吗? 您控制该类,如果您想定义是否要传递该字段,或者您希望如何传递,请向构造函数添加另一个参数 【参考方案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;
    

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

【讨论】:

谢谢老兄,这对它的工作原理很有洞察力

以上是关于Laravel API 资源隐藏键的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent API 资源:从响应(集合)中删除“数据”键

PHP 在 Laravel 中动态隐藏 API 字段

向 laravel 中的资源 json 响应添加状态和消息键

在 Laravel 中向 API 资源链接添加参数 [重复]

使用 laravel 一次调用多个 API 资源

Laravel 5.6 API 资源未显示关系数据