首页 > 后端开发 > php教程 > Laravel快速提示:模型路线绑定

Laravel快速提示:模型路线绑定

Christopher Nolan
发布: 2025-02-10 11:35:12
原创
1003 人浏览过

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编辑特定类别,它应该按预期工作,例如:https://www.php.cn/link/604541b9b9f266538ed001ea49fcc956

Laravel Quick Tip: Model Route Binding

Laravel路由模型绑定的常见问题解答 (这部分内容已在原文中详细解答,此处不再赘述)

希望以上内容对您有所帮助!

以上是Laravel快速提示:模型路线绑定的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板