我们在使用路由的时候一个很常见的使用场景就是根据资源 ID 查询资源信息:

Route::get('task/{id}', function ($id) {$task = \App\Models\Task::findOrFail($id);
});

Laravel 提供了一个「路由模型绑定」功能来简化上述代码编写,通过路由模型绑定,我们只需要定义一个特殊约定的参数名(比如 {task})来告知路由解析器需要从 Eloquent 记录中根据给定的资源 ID 去查询模型实例,并将查询结果作为参数传入而不是资源 ID。

有两种方式来实现路由模型绑定:隐式绑定和显式绑定。

隐式绑定

使用路由模型绑定最简单的方式就是将路由参数命名为可以唯一标识对应资源模型的字符串(比如 $task 而非 $id),然后在闭包函数或控制器方法中对该参数进行类型提示,此处参数名需要和路由中的参数名保持一致:

Route::get('task/{task}', function (\App\Models\Task $task) {dd($task); // 打印 $task 明细
});

这样就避免了我们传入 $id 后再进行查询,而是把这种模板式代码交由 Laravel 框架底层去实现。

由于路由参数({task})和方法参数($task)一样,并且我们约定了 $task 类型为 \App\Models\Task,Laravel 就会判定这是一个路由模型绑定,每次访问这个路由时,应用会将传入参数值赋值给 {task},然后默认以参数值作为资源 ID 在底层通过 Eloquent 查询获取对应模型实例,并将结果传递到闭包函数或控制器方法中。

路由模型绑定默认将传入 {task} 参数值作为模型主键 ID 进行 Eloquent 查询,你也可以自定义查询字段,这可以通过在模型类中重写 getRouteKeyName() 来实现:

<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Model;class Task extends Model
{public function getRouteKeyName() {return 'name';  // 以任务名称作为路由模型绑定查询字段}
}

以上就是隐式路由模型绑定的实现,是不是很简单?

显式绑定

显式绑定需要手动配置路由模型绑定,通常需要在 App\Providers\RouteServiceProvider 的 boot() 方法中新增如下这段配置代码:

public function boot()
{// 显式路由模型绑定Route::model('task_model', Task::class);parent::boot();
}

编写完这段代码后,以后每次访问包含 {task_model} 参数的路由时,路由解析器都会从请求 URL 中解析出模型 ID ,然后从对应模型类 Task 中获取相应的模型实例并传递给闭包函数或控制器方法:

Route::get('task/model/{task_model}', function (\App\Models\Task $task) {dd($task);
});

注:如果路由模型绑定对应匹配记录不存在,将自动返回 404 响应。

由于在正式开发中,出于性能的考虑通常会对模型数据进行缓存,此外在很多情况下,需要关联查询才能得到我们需要的结果,所以并不建议过多使用这种路由模型绑定。

转载于:https://www.cnblogs.com/sgm4231/p/10283374.html

laravel 路由模型绑定相关推荐

  1. php 隐式路由,关于Laravel 7 的简单隐式路由模型绑定

    搜索热词 Laravel 的下一个主要发行版本 ,你可以直接在路由定义中自定义隐式路由模型绑定: Route::get('/posts/{post:slug}',function (Post $pos ...

  2. laravel 模型里自定义属性_关于Laravel 7 的简单隐式路由模型绑定

    Laravel 的下一个主要发行版本 ,你可以直接在路由定义中自定义隐式路由模型绑定: Route::get('/posts/{post:slug}', function (Post $post) { ...

  3. 白话学习MVC(六)模型绑定

    一.什么是模型绑定? 模型绑定存在的意义就是为Action的参数提供值,例如:如下表单中提交了数据,那么Action(即:Index)的参数Id,Name的值就是表单中对应的name属性相同的值,而表 ...

  4. laravel路由无法访问,报404,No query results for model [App\Models\...]

    今天遇到了一个问题,在routes/web.php中配置了路由,但始终无法访问该路由,一直报404. Route::resource('gift_packs', 'GiftPacksControlle ...

  5. 【ASP.NET MVC 学习笔记】- 16 Model Binding(模型绑定)

    本文参考:http://www.cnblogs.com/willick/p/3424188.html. 1.Model Binding是Http请求和Action方法之间的桥梁,是MVC框架根据Htt ...

  6. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  7. .NET之模型绑定和验证

    介绍 模型绑定就是接收将来自HTTP请求的数据映射到模型的过程.如果找不到模型属性的值,并不会报错,而是给该属性设置默认值. 示例:比如我们有一个接口为 [HttpGet("{id}&quo ...

  8. .NET Core WEB API中接口参数的模型绑定的理解

    在.NET Core WEB API中参数的模型绑定方式有以下表格中的几种: 微软官方文档说明地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-a ...

  9. 精通ASP.NET MVC ——模型绑定

    模型绑定(Model Binding)是指,用浏览器以Http请求方式发送的数据来创建.Net对象的过程. 准备示例项目 新建一个空的MVC项目,名叫MvcModels,接下去会以此项目来演示各种功能 ...

最新文章

  1. Java学习总结:6
  2. python3.7源码分析-集合(set)
  3. 怎么将一个数组转化成字符串
  4. linux 5.5安装万兆网卡驱动,RedHat 5.5系统下安装MW54U无线USB网卡驱动
  5. C#设置WebBrowser IE浏览器版本
  6. BZOJ2647 : [Neerc2011]Journey
  7. java数字不等于_java – 仅使用set中的数字查找等于或大于给定目标的总和
  8. 三次握手的第三个ACK包丢了,会发生什么?
  9. HTTP和RPC的区别?
  10. Stepper MNKit
  11. mysql索引的方法_mysql索引类型和索引方法
  12. 实现原理 扫描枪_条码扫描枪的工作原理
  13. 写给即将入行的程序员的一封信
  14. Angr源码分析——DDG的生成
  15. 文献阅读(77)稀疏跳零结构(1)
  16. C语言二位十进制计算器模数,十进制转二进制计算器
  17. 软件测试入职工作流程
  18. 世界首个由队伍拥有并运营的CS:GO电竞联盟FLASHPOINT成立
  19. Unity学习笔记(六)---------------GameObject的Active与InActive
  20. 已加载插件:fastestmirror Loading mirror speeds from cached hostfile There are no enabled repos. Run “yum

热门文章

  1. java数字处理_Java数字处理类(上)
  2. 数控直线工作台直线控制系统的simulink仿真
  3. qt 右键显示设置界面 后台运行_1.1安装Qt
  4. 蓝桥训练之前缀和与差分
  5. Welcome To SWPUNC-ACM
  6. 表格数据的识别与提取
  7. [python]python pandas 模块
  8. 移动端常见bug汇总001
  9. SQL SERVER 2008数据库管理与维护总结
  10. 说说VNode节点(Vue.js实现)