Laravel快速提示:模型路线绑定
Laravel路由组件:简化高效的路由管理
本文探讨Laravel强大的路由组件,它提供简洁高效的路由管理方式,支持简洁的URL、参数、分组、命名以及路由组的事件保护等特性。其路由模型绑定功能通过类型提示模型名称而非ID参数,简化了重复性任务的处理。
核心要点:
- 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页面。
该方法具有 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。
