[Laravel]懶出新高度的路由模型綁定

Kunyu
Feb 28, 2024
Photo by Zhang Kenny on Unsplash

在許多網頁應用中,常見的一種場景是根據不同的參數值來顯示不同的資料,對於網頁工程師而言是必備的開發技巧之一,現在來看看範例

PHP 使用 URL Query String 進行切換

user.php 會根據 Query String 的值切換成不同的顯示內容,例如使用者的姓名、職稱、班別等等,如果系統有1000人使用,但也只需要寫 user.php 一隻程式就可以滿足分別顯示 1000 的內容。(備註:本篇不談論使用者權限控制相關議題)

https://fatccpsystem.com/user.php?id=1

MVC 框架的路由參數切換

MVC 路由可以傳遞參數給 Controller,Laravel 為例,使用 {xxx} 來代表此為動態參數。

Route::get('/user/{id}', [UserController::class, 'show']);

Controller 方法的參數就是路由的動態參數所傳入,因此可以使用此參數(通常是id)到資料庫查詢出資料,再把資料送給 View。

use App\Models\User;

public function show($id)
{
$user = User::findOrFail($id);
return view('user.show', ['user' => $user]);
}

懶出新高度的 Route Model Binding

Laravel 覺得這樣寫有點麻煩,因此創了一個懶人專用的對應法。

Route::get('/user/{user}', [UserController::class, 'show']);

通過將參數類型指定為 User,Laravel 將自動根據路由參數的值,查詢對應的用戶模型(User model),要注意參數名稱必須跟路由參數一致,因此此例的參數都命名為 user。

use App\Models\User;

public function show(User $user)
{
return view('user.show', ['user' => $user]);
}

(加碼補充)指定要對應的欄位

由於 Route Model Binding 預設情況會跟 Model id 欄位對應,但是我們有可能需要 id 以外的值來對應,那麼就可以在 routes 使用 : 來指定要對應的欄位,例如對應到 user table 的 username 欄位。

Route::get('/user/{user:username}', [UserController::class, 'show']);

--

--