Skip to main content

API 資源是什麼

在建置 API 時,若把 Eloquent 模型直接以 JSON 回傳,可能會洩漏想隱藏的欄位,或送出用戶端不需要的大量資料。 Eloquent API 資源是在模型與 JSON 回應之間插入一層轉換層的機制。你可以在 toArray() 方法中明確定義「要以什麼形式、包含哪些內容於回應中」。 主要優點如下:
  • 可完全控管要放入回應的欄位
  • 欄位改名、值加工等處理可集中在同一處
  • 可依條件決定欄位是否出現
  • 可將關聯巢狀化,保持一致的結構

建立資源

make:resource Artisan 指令建立資源類別。
產生的類別會放到 app/Http/Resources 目錄。
透過 $this 可直接存取模型屬性,因為資源類別內部會把屬性存取代理給模型。

在控制器中使用

定義好的資源可從控制器或路由回傳。
或使用模型的 toResource() 方法。
toResource() 會依模型名稱自動尋找對應的資源類別(如 UserResource)。 預設情況下,回應會被包在 data 鍵中。

資源集合

當要回傳多筆模型時使用 collection() 方法。
或使用 Eloquent 集合的 toResourceCollection()

自訂集合資源

若要對整個集合加入 meta 資料,可建立專用的集合資源。

欄位加工與轉換

toArray() 內可以改變欄位名稱或加工值。

條件式欄位

when() — 依條件加入欄位

若想在符合特定條件時才加入某欄位,可用 when()
when() 條件為 false 時,該 key 本身將自回應中移除。

mergeWhen() — 一次條件加入多個欄位

若要以相同條件一次加入多個欄位,可使用 mergeWhen()

whenLoaded() — 只包含已載入的關聯

當關聯已被 Eager Load 時才包含,可在避免 N+1 問題的同時,建立彈性的回應。
在控制器端可控制是否要載入關聯:

whenCounted() — 有條件地包含計數

包含以 loadCount() 取得的關聯計數。

巢狀資源

將關聯以其他資源類別巢狀化,可維持一致的結構。

加入 meta 資料

with() — 頂層 meta 資料

要為整個集合加入 meta 資料,可覆寫 with()
回應範例:

additional() — 動態加入 meta 資料

若想在控制器端動態加入 meta 資料,使用 additional()

與分頁的結合

只要將分頁結果傳給資源,metalinks 就會自動加上。
或:
回應範例:
在分頁回應中,即使呼叫了 withoutWrapping()data 鍵仍會保留。這是為了與分頁的 metalinks 共存。

停用資料包裝

預設情況下最外層的資源會被 data 鍵包裝。若要停用,可在 AppServiceProviderboot() 中呼叫 withoutWrapping()
withoutWrapping() 只影響最外層包裝,不會移除你自己定義的 data 鍵。

實戰範例:使用者 API 的實作

以使用者管理 API 為例,展示如何運用資源設計一致的回應。

UserResource

UserController

相關頁面

Eloquent 關聯入門

瞭解關聯的定義方式與 Eager Loading。

分頁

瞭解如何將分頁結果與 API 資源結合。
最後修改於 2026年8月2日