首頁 > 後端開發 > php教程 > Laravel快速提示:模型路線綁定

Laravel快速提示:模型路線綁定

Christopher Nolan
發布: 2025-02-10 11:35:12
原創
977 人瀏覽過

Laravel路由組件:簡化高效的路由管理

本文探討Laravel強大的路由組件,它提供簡潔高效的路由管理方式,支持簡潔的URL、參數、分組、命名以及路由組的事件保護等特性。其路由模型綁定功能通過類型提示模型名稱而非ID參數,簡化了重複性任務的處理。

Laravel Quick Tip: Model Route Binding

核心要點:

  • Laravel的路由組件提供簡單高效的路由管理方式,支持簡潔URL、參數、分組、命名以及事件保護路由組等功能。路由模型綁定功能通過類型提示模型名稱而非ID參數,簡化了重複性任務處理。
  • Laravel的路由模型綁定會自動使用ID參數解析模型,如果模型不存在則拋出異常。 App\Exceptions\Handler@render方法負責將異常轉換為HTTP響應,可用於處理ModelNotFoundException並重定向到404頁面。
  • Laravel允許自定義路由模型綁定,例如重寫父模型類的getRouteKeyName方法來使用不同的屬性名稱,比如UUID。這有助於避免將內部ID暴露給最終用戶。

示例:管理後台類別

假設數據庫中有一系列類別,管理員可在後台管理這些類別。路由文件如下:

Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () {
    Route::resource('categories', 'CategoriesController');
});
登入後複製
登入後複製

CategoriesController類包含七個資源方法。在edit操作中,需要檢查待編輯的類別是否存在於數據庫中,否則返回錯誤消息並重定向:

public function edit($id)
{
    $category = Category::find($id);
    if (!$category) {
        return redirect()->route('admin.categories.index')->withErrors([trans('errors.category_not_found')]);
    }

    // ...
}
登入後複製
登入後複製

路由模型綁定

這是常規做法,但Laravel提供了一種更優化的方式——路由模型綁定。只需類型提示模型名稱即可,無需ID參數。

可用路由列表如下:

<code>+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+
| Domain | Method    | URI                                | Name                               | Action                                                               | Middleware      |
+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+
|        | GET|HEAD  | admin/categories                   | admin.categories.index             | App\Http\Controllers\Admin\CategoriesController@index                | web,admin       |
|        | POST      | admin/categories                   | admin.categories.store             | App\Http\Controllers\Admin\CategoriesController@store                | web,admin       |
|        | GET|HEAD  | admin/categories/create            | admin.categories.create            | App\Http\Controllers\Admin\CategoriesController@create               | web,admin       |
|        | GET|HEAD  | admin/categories/{categories}      | admin.categories.show              | App\Http\Controllers\Admin\CategoriesController@show                 | web,admin       |
|        | PUT|PATCH | admin/categories/{categories}      | admin.categories.update            | App\Http\Controllers\Admin\CategoriesController@update               | web,admin       |
|        | DELETE    | admin/categories/{categories}      | admin.categories.destroy           | App\Http\Controllers\Admin\CategoriesController@destroy              | web,admin       |
|        | GET|HEAD  | admin/categories/{categories}/edit | admin.categories.edit              | App\Http\Controllers\Admin\CategoriesController@edit                 | web,admin       |</code>
登入後複製

路由參數為 {categories},可根據需要修改。 Laravel提供了一個修改它的選項:

Route::resource('categories', 'CategoriesController', [
    'parameters' => 'singular',
]);
登入後複製

修改後的路由:

<code>+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+
| Domain | Method    | URI                                | Name                               | Action                                                               | Middleware      |
+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+
|        | GET|HEAD  | admin/categories                   | admin.categories.index             | App\Http\Controllers\Admin\CategoriesController@index                | web,admin       |
|        | POST      | admin/categories                   | admin.categories.store             | App\Http\Controllers\Admin\CategoriesController@store                | web,admin       |
|        | GET|HEAD  | admin/categories/create            | admin.categories.create            | App\Http\Controllers\Admin\CategoriesController@create               | web,admin       |
|        | GET|HEAD  | admin/categories/{category}        | admin.categories.show              | App\Http\Controllers\Admin\CategoriesController@show                 | web,admin       |
|        | PUT|PATCH | admin/categories/{category}        | admin.categories.update            | App\Http\Controllers\Admin\CategoriesController@update               | web,admin       |
|        | DELETE    | admin/categories/{category}        | admin.categories.destroy           | App\Http\Controllers\Admin\CategoriesController@destroy              | web,admin       |
|        | GET|HEAD  | admin/categories/{category}/edit   | admin.categories.edit              | App\Http\Controllers\Admin\CategoriesController@edit                 | web,admin       |</code>
登入後複製

注意: Laravel 5.3 默認使用單數形式。

public function edit(Category $category)
{
    return view('admin.categories.edit', [
        'category'      => $category
    ]);
}
登入後複製

現在,Laravel將自動使用ID參數解析類別,如果模型不存在則拋出異常。

注意: 除非參數有默認值,否則它使用 findOrFail Eloquent 方法來解析參數。

異常處理

App\Exceptions\Handler@render 方法負責將異常轉換為HTTP響應。我們將使用它來處理 ModelNotFoundException 並重定向到404頁面。

該方法具有 requestexception 參數,可用於確定要執行的操作。

Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () {
    Route::resource('categories', 'CategoriesController');
});
登入後複製
登入後複製

我們測試拋出的異常是否為 ModelNotFoundException 的實例。我們還可以測試模型名稱以顯示正確的錯誤消息。為了避免為所有模型添加多個 if 測試,我們可以創建一個索引消息數組,並使用模型類名來提取正確的消息。

參數解析

Laravel 使用名稱和類型提示來解析路由參數。如果參數類型是模型,則它嘗試使用 ID 在數據庫中查找記錄,如果找不到記錄則失敗。

自定義路由鍵

為避免將內部ID暴露給最終用戶,通常使用UUID。但由於Laravel使用表主鍵來解析綁定參數,因此始終會拋出錯誤!

為此,Laravel允許我們重寫父模型類的getRouteKeyName方法。該方法應返回屬性名稱,在本例中為UUID。

public function edit($id)
{
    $category = Category::find($id);
    if (!$category) {
        return redirect()->route('admin.categories.index')->withErrors([trans('errors.category_not_found')]);
    }

    // ...
}
登入後複製
登入後複製

現在,如果我們嘗試使用UUID編輯特定類別,它應該按預期工作,例如://m.sbmmt.com/link/604541b9b9f266538ed001ea49fcc956

Laravel Quick Tip: Model Route Binding

Laravel路由模型綁定的常見問題解答 (這部分內容已在原文中詳細解答,此處不再贅述)

希望以上內容對您有所幫助!

以上是Laravel快速提示:模型路線綁定的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板