iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Modern Web

後端菜雞仔想學 Laravel系列 第 23

API Resources:將你的第一手資料進行包裝

  • 分享至 

  • xImage
  •  

新增的產品、類別資料都是第一手資料,但通常呈現給使用者或前端會是「篩選過的資料」。

那該如何呈現「篩選過的資料」?
可以建立一個 API Resource 將資料進行包裝。

例如:查詢特定產品資料

{
    "id": 1,
    "type_id": 1,
    "product_name": "杏仁瓦片",
    "product_description": "12入,很好吃,送禮自用兩相宜!",
    "price": 220,
    "created_at": "2024-10-06 17:42",
    "updated_at": "2024-10-06 17:42"
}

目前需求

查詢產品資料時,需要將類別資料一起顯示出來。

但我會希望呈現給使用者的是只有:

  • 產品的 id
  • 類別的 id
  • 類別名稱
  • 產品名稱
  • 產品敘述
  • 產品價格

所以我會將以下資料隱藏:

  • 類別的排序
  • 類別的建立 & 更新時間
  • 產品的建立 & 更新時間

動手做做看

建立資源檔案

使用 artisan 指令來建立:

php artisan make:resource TypeResource
php artisan make:resource ProductResource

修改 TypeResource:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

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

修改 ProductResource:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class ProductResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @return array<string, mixed>
     */
    public function toArray(Request $request): array
    {
        return [
            'id' => $this->id,
            'type' => new TypeResource($this->type),
            'product_name' => $this->product_name,
            'product_description' => $this->product_description,
            'price' => $this->price,
        ];
    }
}

修改 ProductController 的 show 方法:

  • 使用 ProductResource 將產品模型包裝成 JSON 格式回傳。
public function show(Product $product)
{
    // 回傳特定商品資料
    return response(new ProductResource($product), Response::HTTP_OK);
        
}

更多相關資料可以參考:

使用 Postman 測試

查詢特定產品資料:

{
    "id": 1,
    "type": {
        "id": 1,
        "name": "甜點"
    },
    "product_name": "杏仁瓦片",
    "product_description": "12入,很好吃,送禮自用兩相宜!",
    "price": 220
}

僅顯示已篩選過的資料,表示測試成功!


上一篇
hasMany & belongsTo:建立模型關聯
下一篇
JWT 認證機制:拿好你當天購買的門票,明天進來要再重新買一張!
系列文
後端菜雞仔想學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言