API 資源是什麼
在建置 API 時,若把 Eloquent 模型直接以 JSON 回傳,可能會洩漏想隱藏的欄位,或送出用戶端不需要的大量資料。 Eloquent API 資源是在模型與 JSON 回應之間插入一層轉換層的機制。你可以在toArray() 方法中明確定義「要以什麼形式、包含哪些內容於回應中」。
主要優點如下:
- 可完全控管要放入回應的欄位
- 欄位改名、值加工等處理可集中在同一處
- 可依條件決定欄位是否出現
- 可將關聯巢狀化,保持一致的結構
建立資源
以make:resource Artisan 指令建立資源類別。
app/Http/Resources 目錄。
$this 可直接存取模型屬性,因為資源類別內部會把屬性存取代理給模型。
在控制器中使用
定義好的資源可從控制器或路由回傳。toResource() 方法。
toResource() 會依模型名稱自動尋找對應的資源類別(如 UserResource)。
預設情況下,回應會被包在 data 鍵中。
資源集合
當要回傳多筆模型時使用collection() 方法。
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()。
與分頁的結合
只要將分頁結果傳給資源,meta 與 links 就會自動加上。
在分頁回應中,即使呼叫了
withoutWrapping(),data 鍵仍會保留。這是為了與分頁的 meta、links 共存。停用資料包裝
預設情況下最外層的資源會被data 鍵包裝。若要停用,可在 AppServiceProvider 的 boot() 中呼叫 withoutWrapping()。
實戰範例:使用者 API 的實作
以使用者管理 API 為例,展示如何運用資源設計一致的回應。UserResource
UserController
相關頁面
Eloquent 關聯入門
瞭解關聯的定義方式與 Eager Loading。
分頁
瞭解如何將分頁結果與 API 資源結合。