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

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

Christopher Nolan
Christopher Nolan原創
2025-02-10 11:35:12922瀏覽

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暴露給最終用戶。

示例:管理後台類別

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

<code class="language-php">Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () {
    Route::resource('categories', 'CategoriesController');
});</code>

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

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

    // ...
}</code>

路由模型綁定

這是常規做法,但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提供了一個修改它的選項:

<code class="language-php">Route::resource('categories', 'CategoriesController', [
    'parameters' => 'singular',
]);</code>

修改後的路由:

<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 默認使用單數形式。

<code class="language-php">public function edit(Category $category)
{
    return view('admin.categories.edit', [
        'category'      => $category
    ]);
}</code>

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

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

異常處理

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

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

<code class="language-php">Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () {
    Route::resource('categories', 'CategoriesController');
});</code>

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

參數解析

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

自定義路由鍵

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

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

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

    // ...
}</code>

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

Laravel Quick Tip: Model Route Binding

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

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

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn