3

という API リソースがあり、FilmResourceというモデルに新しい属性をis_new追加し、この新しい属性をリソース ファイルに追加しました。問題は、この API リソースを利用する 2 つのエンドポイントがあり、属性を返すことです。両方についてですが、1 つのメソッドに対してのみ返してほしいのですが、特定のキーを応答で返すように指定する方法はありますか? APIリソースからのみ送信されるため、使用makeVisibleしても違いはありません。

フィルムコントローラー

これは私が返したいメソッドです。同様の別のメソッドがありますが、そのために返されたくありません。

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

2 つの異なる 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'
            ]
        );
    }
}

最も完全な応答から不完全な応答まで書いていることに注意してください。そのため、データの出力方法に関する完全な定義を持つクラスは 1 つしかなく、他のクラスはいくつかのフィールドを削除してそれを使用します (また、必要な変換を行うこともできます)。 )。

私が提案したもう1つの方法は、リクエストを使用して何を表示するかを知ることですが、完全に分離されていないため、このソリューションは好きではありません。リソースはルートについて知る必要があり、それは彼の仕事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 に答える