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

更新於 2024/10/28閱讀時間約 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) 的實作。我們會學習如何在控制器中處理請求、進行資料驗證,以及如何與模型互動。

這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
本文介紹 Laravel 中的 Model,透過 Eloquent ORM 進行資料庫互動。內容涵蓋 Model 建立、資料表關聯設定,以及利用 Eloquent 特性來優化程式碼。目的是簡化資料庫操作,提高程式碼可讀性與維護性。接下來將開發後端 API,進一步實現系統功能。
這篇文章介紹在 Laravel 中使用 Migration 管理資料庫結構,實現財務管理系統的資料表建立。Migration 提供版本控制、自動化管理和可移植性,方便開發者同步資料庫變更。還介紹了填充測試資料(Seeder)的操作,提高團隊協作效率。
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
好了,經過前幾篇的努力,我們的開發環境已經搭建完成,並進行了初步的測試。一切看起來都很順利,但在正式進入開發之前,我們還有一件重要的事情要做:加入版本控制。 你可能會想:「現在還早吧?我一個人開發,有必要嗎?」但相信我,版本控制就像是遊戲中的存檔點,或者電影裡的多重宇宙時間線,在你需要的時候,
本文指導如何驗收基於 Docker 的開發環境,檢查 Laravel 後端、Nuxt 前端、Nginx 反向代理和 MariaDB 資料庫是否正常運行。透過啟動容器、修改 hosts 檔案、測試各服務的運作,確保整個開發環境穩定。並且提供了常見問題的解決方案,幫助開發者順利驗收環境。
本文詳細介紹了如何使用 Docker 環境構建 Laravel 後端和 Nuxt 前端,並通過 Nginx 進行反向代理來協調它們的互動。從 docker-compose.yml 配置到各個服務的設定,讓開發環境穩定運行,並提供了常用的 Docker 指令以便於操作。
本文介紹 Laravel 中的 Model,透過 Eloquent ORM 進行資料庫互動。內容涵蓋 Model 建立、資料表關聯設定,以及利用 Eloquent 特性來優化程式碼。目的是簡化資料庫操作,提高程式碼可讀性與維護性。接下來將開發後端 API,進一步實現系統功能。
這篇文章介紹在 Laravel 中使用 Migration 管理資料庫結構,實現財務管理系統的資料表建立。Migration 提供版本控制、自動化管理和可移植性,方便開發者同步資料庫變更。還介紹了填充測試資料(Seeder)的操作,提高團隊協作效率。
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
好了,經過前幾篇的努力,我們的開發環境已經搭建完成,並進行了初步的測試。一切看起來都很順利,但在正式進入開發之前,我們還有一件重要的事情要做:加入版本控制。 你可能會想:「現在還早吧?我一個人開發,有必要嗎?」但相信我,版本控制就像是遊戲中的存檔點,或者電影裡的多重宇宙時間線,在你需要的時候,
本文指導如何驗收基於 Docker 的開發環境,檢查 Laravel 後端、Nuxt 前端、Nginx 反向代理和 MariaDB 資料庫是否正常運行。透過啟動容器、修改 hosts 檔案、測試各服務的運作,確保整個開發環境穩定。並且提供了常見問題的解決方案,幫助開發者順利驗收環境。
本文詳細介紹了如何使用 Docker 環境構建 Laravel 後端和 Nuxt 前端,並通過 Nginx 進行反向代理來協調它們的互動。從 docker-compose.yml 配置到各個服務的設定,讓開發環境穩定運行,並提供了常用的 Docker 指令以便於操作。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ Params是什麼? 在網頁開發中,params代表的是參數(Parameters)。當你在路由(Route)中定義了一個或多個變數時,這些變數的值就會被存儲在 params 對象中。所以,params 就是用來存儲路由參數的地方,這些參數可以在處理請求時使用。 ※ Params的兩個功能:
Thumbnail
※ 什麼是路由? 當我們說「路由」時,可能是在談論路由器(實體設備),也可能是在談論路由(選擇路徑的過程),或者是在談論路徑(資料封包的傳輸路徑)。 路由器 (Router):這是一種實體設備,負責將資料封包 (Packet) 從一個網路傳送到另一個網路。它的工作方式類似於交通指揮,確保資料封包
Thumbnail
這篇文章介紹了路由器 (Router) 在網絡硬體中的功能與運作概念,包括路由器的工作原理、運作流程和與其他硬體設備的區別。文章也提及了路由器運作的基本概念,例如路由表的建立方式和路由協定的基礎知識。
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ Params是什麼? 在網頁開發中,params代表的是參數(Parameters)。當你在路由(Route)中定義了一個或多個變數時,這些變數的值就會被存儲在 params 對象中。所以,params 就是用來存儲路由參數的地方,這些參數可以在處理請求時使用。 ※ Params的兩個功能:
Thumbnail
※ 什麼是路由? 當我們說「路由」時,可能是在談論路由器(實體設備),也可能是在談論路由(選擇路徑的過程),或者是在談論路徑(資料封包的傳輸路徑)。 路由器 (Router):這是一種實體設備,負責將資料封包 (Packet) 從一個網路傳送到另一個網路。它的工作方式類似於交通指揮,確保資料封包
Thumbnail
這篇文章介紹了路由器 (Router) 在網絡硬體中的功能與運作概念,包括路由器的工作原理、運作流程和與其他硬體設備的區別。文章也提及了路由器運作的基本概念,例如路由表的建立方式和路由協定的基礎知識。
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更