Laravel路由组件:简化高效的路由管理
本文探讨Laravel强大的路由组件,它提供简洁高效的路由管理方式,支持简洁的URL、参数、分组、命名以及路由组的事件保护等特性。其路由模型绑定功能通过类型提示模型名称而非ID参数,简化了重复性任务的处理。
核心要点:
App\Exceptions\Handler@render
方法负责将异常转换为HTTP响应,可用于处理ModelNotFoundException
并重定向到404页面。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页面。
该方法具有 request
和 exception
参数,可用于确定要执行的操作。
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编辑特定类别,它应该按预期工作,例如:https://www.php.cn/link/604541b9b9f266538ed001ea49fcc956。
Laravel路由模型绑定的常见问题解答 (这部分内容已在原文中详细解答,此处不再赘述)
希望以上内容对您有所帮助!
以上是Laravel快速提示:模型路线绑定的详细内容。更多信息请关注PHP中文网其他相关文章!