laravel 路由模型綁定
我們在使用路由的時候一個很常見的使用場景就是根據資源 ID 查詢資源信息:
Route::get(‘task/{id}‘, function ($id) {
$task = \App\Models\Task::findOrFail($id);
});
Laravel 提供了一個「路由模型綁定」功能來簡化上述代碼編寫,通過路由模型綁定,我們只需要定義一個特殊約定的參數名(比如 {task}
)來告知路由解析器需要從 Eloquent 記錄中根據給定的資源 ID 去查詢模型實例,並將查詢結果作為參數傳入而不是資源 ID。
有兩種方式來實現路由模型綁定:隱式綁定和顯式綁定。
隱式綁定
使用路由模型綁定最簡單的方式就是將路由參數命名為可以唯一標識對應資源模型的字符串(比如 $task
$id
),然後在閉包函數或控制器方法中對該參數進行類型提示,此處參數名需要和路由中的參數名保持一致:
Route::get(‘task/{task}‘, function (\App\Models\Task $task) {
dd($task); // 打印 $task 明細
});
這樣就避免了我們傳入 $id
後再進行查詢,而是把這種模板式代碼交由 Laravel 框架底層去實現。
由於路由參數({task}
)和方法參數($task
)一樣,並且我們約定了 $task
類型為 \App\Models\Task
,Laravel 就會判定這是一個路由模型綁定,每次訪問這個路由時,應用會將傳入參數值賦值給 {task}
路由模型綁定默認將傳入 {task}
參數值作為模型主鍵 ID 進行 Eloquent 查詢,你也可以自定義查詢字段,這可以通過在模型類中重寫 getRouteKeyName()
來實現:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
public function getRouteKeyName() {
return ‘name‘; // 以任務名稱作為路由模型綁定查詢字段
}
}
以上就是隱式路由模型綁定的實現,是不是很簡單?
顯式綁定
顯式綁定需要手動配置路由模型綁定,通常需要在 App\Providers\RouteServiceProvider
的 boot()
方法中新增如下這段配置代碼:
public function boot()
{
// 顯式路由模型綁定
Route::model(‘task_model‘, Task::class);
parent::boot();
}
編寫完這段代碼後,以後每次訪問包含 {task_model}
參數的路由時,路由解析器都會從請求 URL 中解析出模型 ID ,然後從對應模型類 Task
中獲取相應的模型實例並傳遞給閉包函數或控制器方法:
Route::get(‘task/model/{task_model}‘, function (\App\Models\Task $task) {
dd($task);
});
註:如果路由模型綁定對應匹配記錄不存在,將自動返回 404 響應。
由於在正式開發中,出於性能的考慮通常會對模型數據進行緩存,此外在很多情況下,需要關聯查詢才能得到我們需要的結果,所以並不建議過多使用這種路由模型綁定。
laravel 路由模型綁定