[laravel] Resource的設計理念

更新於 發佈於 閱讀時間約 6 分鐘

在 Laravel 開發 API 時,直接在 Controller 內進行資料加工可能會讓程式碼變得雜亂且難以維護。因此,Laravel 提供 Resource (資源轉換器) 來解決這個問題,讓我們可以統一管理 API 的輸出格式,將模型model或模型集合collection轉換為適合 API 輸出的格式,並在需要時對資料進行處理。


為什麼 API 需要使用 Resource?

在 Web 開發中,前端通常透過 View + Presenter 來決定如何呈現資料。

  • Controller 負責處理請求並傳遞資料
  • View / Presenter 負責資料格式的轉換與顯示

但在 API 開發中,我們沒有 View 層,因此通常需要在 Controller 內處理資料轉換,這導致:

  1. 程式碼雜亂 - Controller 變得難以維護,業務邏輯與資料轉換混在一起。
  2. 重複的資料處理邏輯 - 多個 Controller 可能都需要處理相似的 API 輸出格式,造成重複程式碼。
  3. 缺乏統一性 - 如果 API 輸出格式不統一,前端開發者可能需要額外處理不同的 API 風格。

Laravel Resource 的應用

Laravel 提供了 Resource 來解決這個問題,它的作用類似於 Web 開發中的 Presenter。

用途

  • 作為資料轉換層,將模型轉換為一致的 API 響應格式
  • 控制輸出哪些屬性,格式化數據(如四捨五入、類型轉換)
  • 處理關聯數據的輸出

優點

  • 統一 API 輸出格式
  • 數據轉換和格式化
  • 條件性輸出控制
  • 安全性(隱藏敏感數據)
  • 關聯數據精確控制
  • 簡化 Controller

實戰練習

1. 建立 Resource 類別

Laravel 提供 php artisan make:resource 指令來建立 Resource:

php artisan make:resource UserResource

這會在 app/Http/Resources 目錄下建立 UserResource.php

2. 修改 Resource

開啟 UserResource.php,修改 toArray 方法來決定 API 的輸出格式:

<?php

namespace App\Http\Resources;

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

class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at->toDateTimeString(),
'profile' => new ProfileResource($this->whenLoaded('profile')), // 若有載入關聯,則回傳 Profile
];
}
}

這樣,我們就能夠在 UserResource 內部處理資料的格式轉換,而不需要在 Controller 內部寫這些邏輯。

3. 在 Controller 中使用 Resource

UserController.php 中,我們可以直接使用 UserResource 來格式化輸出:

<?php

use App\Http\Resources\UserResource;
use App\Models\User;

class UserController extends Controller
{
public function show($id)
{
$user = User::with('profile')->findOrFail($id);
return new UserResource($user);
}
}

若是返回多筆資料,可以使用 Resource Collection

<?php

use App\Http\Resources\UserResource;
use App\Models\User;

class UserController extends Controller
{
public function index()
{
$users = User::with('profile')->paginate(10);
return UserResource::collection($users);
}
}


總結

  • Resource 可用來處理 API 輸出格式,避免在 Controller 內部寫過多的資料轉換邏輯。
  • 類似於 Web 開發中的 Presenter,讓 API 的輸出變得更有結構且易於維護。
  • 透過 Resource Collection 處理多筆資料,確保 API 回應的統一性。

這樣的設計不僅讓 API 更加清晰,也提升了可讀性與擴展性!



歡迎來到彼得的沙龍,在這裡,我將與你分享書籍精華的智慧、人際溝通的技巧、理財增值的秘訣,以及情緒管理的策略。不僅幫助你打好財務基礎,還能引領你在人生的每個環節中游刃有餘。如果你渴望成長,並追求更充實的生活,這裡就是你值得關注的空間。立即加入,與我一起探索成長的無限可能!
留言
avatar-img
留言分享你的想法!
撰寫程式碼時,測試扮演著至關重要的角色,能有效確保程式碼品質與穩定性。本文深入探討單元測試 (Unit Test) 與功能測試 (Feature Test) 的差異、應用場景及實務操作,並以 3A 原則 與 PHPUnit 指令範例,幫助開發者提升程式碼測試效率及可維護性。
本文介紹了 Docker 的基本概念,包括 Docker Image、Docker Container、Dockerfile、Docker Compose 及其應用情境,如開發與測試環境、微服務架構和持續整合/持續部署。瞭解這些內容能幫助開發人員更有效地利用 Docker 進行應用程式的部署和管理。
本文探討如何利用政府提供的YouBike開放數據進行數據分析,以揭示共享單車系統的使用趨勢。作者使用Google Apps Script分析不同時間點的YouBike使用率,並通過線性回歸預測供需平衡,以及針對特定站點的使用模式進行深入挖掘。最後總結了公館不同出口的使用情況,提供了最佳的租借選擇。
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
撰寫程式碼時,測試扮演著至關重要的角色,能有效確保程式碼品質與穩定性。本文深入探討單元測試 (Unit Test) 與功能測試 (Feature Test) 的差異、應用場景及實務操作,並以 3A 原則 與 PHPUnit 指令範例,幫助開發者提升程式碼測試效率及可維護性。
本文介紹了 Docker 的基本概念,包括 Docker Image、Docker Container、Dockerfile、Docker Compose 及其應用情境,如開發與測試環境、微服務架構和持續整合/持續部署。瞭解這些內容能幫助開發人員更有效地利用 Docker 進行應用程式的部署和管理。
本文探討如何利用政府提供的YouBike開放數據進行數據分析,以揭示共享單車系統的使用趨勢。作者使用Google Apps Script分析不同時間點的YouBike使用率,並通過線性回歸預測供需平衡,以及針對特定站點的使用模式進行深入挖掘。最後總結了公館不同出口的使用情況,提供了最佳的租借選擇。
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
你可能也想看
Google News 追蹤
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
※ 什麼是 RESTful API? 這種運用 HTTP 來表達語義的路由設計風格稱為 RESTful API,它描述了如何實現 Web API 的架構。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為
Thumbnail
當這產品的這個 API 被呼叫,再從回傳內容的某個欄位欄位來判斷,只要“這個欄位”顯示 false 就代表不支援」,雖然這樣的設計也能滿足功能需求…
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
指令在現代 Laravel Web Applications 中,也是一個相當常見的應用,而 Laravel 也為此準備許多方便實現測試的函數,以下就來為大家介紹: artisan() 函數簽名: artisan($command, $parameters = []) 函數說明:這應該是指令測
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
※ 什麼是 RESTful API? 這種運用 HTTP 來表達語義的路由設計風格稱為 RESTful API,它描述了如何實現 Web API 的架構。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為
Thumbnail
當這產品的這個 API 被呼叫,再從回傳內容的某個欄位欄位來判斷,只要“這個欄位”顯示 false 就代表不支援」,雖然這樣的設計也能滿足功能需求…
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
指令在現代 Laravel Web Applications 中,也是一個相當常見的應用,而 Laravel 也為此準備許多方便實現測試的函數,以下就來為大家介紹: artisan() 函數簽名: artisan($command, $parameters = []) 函數說明:這應該是指令測