D11 - 開啟 Laravel 路由設定,打造靈活的 API 入口

更新 發佈閱讀 12 分鐘

哈囉,大家好!在前面的文章中,我們已經建立了資料庫結構,並使用 Model 與資料庫進行互動。現在,我們準備開始開發後端 API。在這個過程中,路由(Route) 扮演著至關重要的角色,決定了使用者的請求如何被處理。

由於篇幅的關係,我們將這個主題分成兩部分:今天我們專注於 路由設定,下一篇則會深入探討 控制器(Controller) 的實作。

一、為什麼路由這麼重要?

在 Laravel 中,路由是所有請求的入口。它負責將 HTTP 請求導向適當的控制器方法或閉包函式。透過靈活的路由設定,我們可以:

  • 定義 API 的結構:清晰的路由讓 API 結構一目了然。
  • 控制中介層(Middleware):在路由層面指定中介層,增加安全性或功能性。
  • 提高可讀性:良好的路由命名和組織讓程式碼更易於維護。

二、設定 API 路由

Laravel 提供了多種方式來定義路由,讓我們來看看如何手動定義 API 路由,並使用群組和前綴來組織路由。

1. 編輯 routes/api.php

打開 routes/api.php,你會看到預設的內容。我們可以在這裡新增我們的 API 路由。

2. 手動定義路由

我是不太習慣使用 Route::apiResource,因為可以手動定義每個路由,這樣可以對每個路由有更細緻且完整的控制。

範例:為使用者(User)資源定義路由

use App\Http\Controllers\UserController;

Route::get('users', [UserController::class, 'index']); // 列出所有使用者
Route::post('users', [UserController::class, 'store']); // 建立新使用者
Route::get('users/{id}', [UserController::class, 'show']); // 顯示特定使用者
Route::put('users/{id}', [UserController::class, 'update']); // 更新使用者資料
Route::delete('users/{id}', [UserController::class, 'destroy']); // 刪除使用者

這樣,我們就手動定義了每一個路由,並指定了對應的控制器方法。

3. 使用路由群組

為了讓路由更加結構化,我們可以使用 Route::group 來組織路由。

Route::prefix('users')->group(function () {
Route::get('/', [UserController::class, 'index']);
Route::post('/', [UserController::class, 'store']);
Route::get('/{id}', [UserController::class, 'show']);
Route::put('/{id}', [UserController::class, 'update']);
Route::delete('/{id}', [UserController::class, 'destroy']);
});

透過 prefix,我們將所有的使用者相關路由都歸類在 /users 路徑下。

4. 使用命名路由

為了方便在程式碼中引用路由,我們可以為路由命名。

Route::get('users', [UserController::class, 'index'])->name('users.index');

這樣,我們就可以在程式碼中使用 route('users.index') 來取得路由的 URL。

5. 指定中介層(Middleware)

我們可以在路由上指定中介層,增加額外的功能,如身份驗證、日誌記錄等。

Route::middleware('auth:sanctum')->group(function () {
// 受保護的路由
Route::get('bank-accounts', [BankAccountController::class, 'index']);
// 其他需要保護的路由
});

6. 路由參數的約束

我們可以為路由參數設定約束,確保請求的參數符合預期。

Route::get('users/{id}', [UserController::class, 'show'])
->where('id', '[0-9]+');

這表示 {id} 必須是數字,否則會回傳 404 錯誤。

三、為其他資源定義路由

按照同樣的方式,我們可以為其他資源如 BankAccount、Category 和 Transaction 定義路由。

1. BankAccount 路由

use App\Http\Controllers\BankAccountController;

Route::prefix('bank-accounts')->group(function () {
Route::get('/', [BankAccountController::class, 'index']);
Route::post('/', [BankAccountController::class, 'store']);
Route::get('/{id}', [BankAccountController::class, 'show']);
Route::put('/{id}', [BankAccountController::class, 'update']);
Route::delete('/{id}', [BankAccountController::class, 'destroy']);
});

2. Category 路由

use App\Http\Controllers\CategoryController;

Route::prefix('categories')->group(function () {
Route::get('/', [CategoryController::class, 'index']);
Route::post('/', [CategoryController::class, 'store']);
Route::get('/{id}', [CategoryController::class, 'show']);
Route::put('/{id}', [CategoryController::class, 'update']);
Route::delete('/{id}', [CategoryController::class, 'destroy']);
});

3. Transaction 路由

use App\Http\Controllers\TransactionController;

Route::prefix('transactions')->group(function () {
Route::get('/', [TransactionController::class, 'index']);
Route::post('/', [TransactionController::class, 'store']);
Route::get('/{id}', [TransactionController::class, 'show']);
Route::put('/{id}', [TransactionController::class, 'update']);
Route::delete('/{id}', [TransactionController::class, 'destroy']);
});

四、進階路由技巧

1. 子資源路由

有時,我們需要定義子資源的路由。例如,取得特定使用者的所有銀行帳戶。

Route::get('users/{userId}/bank-accounts', [BankAccountController::class, 'getByUser']);

2. 路由命名空間

為了避免在每個路由中都指定完整的控制器名稱,可以使用命名空間。

Route::namespace('App\Http\Controllers')->group(function () {
// 在這裡定義的路由都在指定的命名空間下
});

3. 路由資源控制器

如果你想要使用 Laravel 提供的資源控制器,但又不想使用 apiResource,可以使用 Route::resource,然後在路由選項中指定 only 或 except。

Route::resource('users', UserController::class)->only([
'index', 'show', 'store', 'update', 'destroy'
]);

五、測試路由

1. 使用 php artisan route:list

執行以下指令,可以查看所有已定義的路由,確認路由是否正確。

php artisan route:list

2. 測試路由的Response

使用 Postman 或其他 API 測試工具,發送請求到定義的路由,檢查是否得到預期的response。

六、個人經驗分享

在開發過程中,良好的路由設計能夠大大提高開發效率和程式碼的可維護性。手動定義路由雖然可能看起來繁瑣,但它給予我們更高的靈活性。我曾在一個專案中,需要對不同的路由應用不同的中介層和參數約束,手動定義路由讓我能夠精細地控制每個路由的行為。

小結

透過本篇文章,我們學習了如何在 Laravel 中手動定義路由,並使用群組、前綴和中介層來組織路由。我們了解了:

  • 手動定義路由的方法,適用於更細緻的控制需求。
  • 使用 Route::group、prefix 和 middleware 來組織和保護路由。
  • 進階的路由技巧,如子資源路由和路由命名空間。

個人經驗分享:掌握路由的各種用法,能夠讓你的專案架構更加清晰,程式碼也更易於維護。

Next

在理解了路由的設定後,下一篇我們將深入探討 控制器(Controller) 的實作。我們會學習如何在控制器中處理請求、進行資料驗證,以及如何與模型互動。

留言
avatar-img
留言分享你的想法!
avatar-img
詹姆士的軟體易開罐
28會員
89內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/14
哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。 現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。 透過這次的實作,我們將學習如何在 N
Thumbnail
2024/12/14
哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。 現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。 透過這次的實作,我們將學習如何在 N
Thumbnail
看更多
你可能也想看
Thumbnail
本文將介紹在實作 API 時需要注意的幾個重要細節,涵蓋參數接收、驗證方法、資料整理及回傳回應的最佳實踐。透過有效的規則和自訂類別,可以提升程式碼可維護性,並加強開發效率。此外,文章還將探討如何處理 API 的回應狀態碼,幫助開發人員在項目中避開常見的錯誤。
Thumbnail
本文將介紹在實作 API 時需要注意的幾個重要細節,涵蓋參數接收、驗證方法、資料整理及回傳回應的最佳實踐。透過有效的規則和自訂類別,可以提升程式碼可維護性,並加強開發效率。此外,文章還將探討如何處理 API 的回應狀態碼,幫助開發人員在項目中避開常見的錯誤。
Thumbnail
在 Laravel 開發 API 時,直接在 Controller 內進行資料加工可能會讓程式碼變得雜亂且難以維護。因此,Laravel 提供 Resource (資源轉換器) 來解決這個問題,讓我們可以統一管理 API 的輸出格式,將模型model或模型集合collection轉換為適合 API
Thumbnail
在 Laravel 開發 API 時,直接在 Controller 內進行資料加工可能會讓程式碼變得雜亂且難以維護。因此,Laravel 提供 Resource (資源轉換器) 來解決這個問題,讓我們可以統一管理 API 的輸出格式,將模型model或模型集合collection轉換為適合 API
Thumbnail
本文探討控制反轉(IoC)和依賴注入的設計原則,解釋如何利用這些理念降低程式碼的耦合度,提高可擴展性和測試性。通過案例說明,控制反轉改變了程式控制的方式,並介紹依賴注入的三種注入方式及其在 Laravel 框架中的應用。讀者將能夠理解這些設計原則在實際專案中的重要性。
Thumbnail
本文探討控制反轉(IoC)和依賴注入的設計原則,解釋如何利用這些理念降低程式碼的耦合度,提高可擴展性和測試性。通過案例說明,控制反轉改變了程式控制的方式,並介紹依賴注入的三種注入方式及其在 Laravel 框架中的應用。讀者將能夠理解這些設計原則在實際專案中的重要性。
Thumbnail
※ 什麼是路由? 當我們說「路由」時,可能是在談論路由器(實體設備),也可能是在談論路由(選擇路徑的過程),或者是在談論路徑(資料封包的傳輸路徑)。 路由器 (Router):這是一種實體設備,負責將資料封包 (Packet) 從一個網路傳送到另一個網路。它的工作方式類似於交通指揮,確保資料封包
Thumbnail
※ 什麼是路由? 當我們說「路由」時,可能是在談論路由器(實體設備),也可能是在談論路由(選擇路徑的過程),或者是在談論路徑(資料封包的傳輸路徑)。 路由器 (Router):這是一種實體設備,負責將資料封包 (Packet) 從一個網路傳送到另一個網路。它的工作方式類似於交通指揮,確保資料封包
Thumbnail
Laravel是一個以MVC(參考:[設計模式]MVC)為架構的PHP Web框架。Laravel支援使用者身份驗證和授權,提供模組化套件系統。Laravel使用Blade模板系統將PHP程式碼與HTML網頁分離。 安裝環境 下載安裝composer https://getcomposer.o
Thumbnail
Laravel是一個以MVC(參考:[設計模式]MVC)為架構的PHP Web框架。Laravel支援使用者身份驗證和授權,提供模組化套件系統。Laravel使用Blade模板系統將PHP程式碼與HTML網頁分離。 安裝環境 下載安裝composer https://getcomposer.o
Thumbnail
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
Thumbnail
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
Thumbnail
學習框架前第一步,先理解框架的生命週期 學習完PHP程式基礎後,就會開始進入框架的學習,為了能理解Laravel框架是如何運作的,就必須清楚框架的生命週期,這也是面試時的必考題哦。
Thumbnail
學習框架前第一步,先理解框架的生命週期 學習完PHP程式基礎後,就會開始進入框架的學習,為了能理解Laravel框架是如何運作的,就必須清楚框架的生命週期,這也是面試時的必考題哦。
Thumbnail
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Thumbnail
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News