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中文网其他相关文章!

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你应该关心DependencyInjection(DI),因为它能让你的代码更清晰、更易维护。1)DI通过解耦类,使其更模块化,2)提高了测试的便捷性和代码的灵活性,3)使用DI容器可以管理复杂的依赖关系,但要注意性能影响和循环依赖问题,4)最佳实践是依赖于抽象接口,实现松散耦合。

是的,优化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)优化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,并避免使用

theKeyStrategiestosiminificallyBoostphpapplicationPermenCeare:1)useOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)优化AtabaseInteractionswithPreparedStateTemtStatementStatementSandProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版
好用的JavaScript开发工具