Laravel路由組件:簡化高效的路由管理
本文探討Laravel強大的路由組件,它提供簡潔高效的路由管理方式,支持簡潔的URL、參數、分組、命名以及路由組的事件保護等特性。其路由模型綁定功能通過類型提示模型名稱而非ID參數,簡化了重複性任務的處理。
核心要點:
App\Exceptions\Handler@render
方法負責將異常轉換為HTTP響應,可用於處理ModelNotFoundException
並重定向到404頁面。 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頁面。
該方法具有 request
和 exception
參數,可用於確定要執行的操作。
<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路由模型綁定的常見問題解答 (這部分內容已在原文中詳細解答,此處不再贅述)
希望以上內容對您有所幫助!
以上是Laravel快速提示:模型路線綁定的詳細內容。更多資訊請關注PHP中文網其他相關文章!