3分钟短文:Laravel路由加模型等于?
引言
上一章我们用3分钟时间光速入门了laravel控制的用法,本章不准备说控制器了,说一说另外俩模块,就是路由Route和模型Model,这俩直接加起来,会有什么奇思妙想的发生呢?
请大家接着往下看。
代码时间
还是最早我们讲的那种方式,在路由地址上通过位置参数绑定,我们可以获取到用户输入的数据。只不过,为了与模型文件对应起来,可以直接在路由处理方法的闭包内调用模型方法,并组装数据返回。
比如传入id数值,返回查询后的结果:
Route::get('conferences/{id}', function ($id) {
$conference = Conference::findOrFail($id);
});
其中 findOrFail 方法是一个内置的语法糖,用于根据id查询条目,找不到的抛出404错误页面。上面的路由也是很多地方都在用的通用的做法,可是程序员总是懒惰的,能少写一行就少写一行。laravel为我们准备了更多。
隐式绑定
首先来看一下默认的隐式路由模型绑定。
什么意思呢?就是路由内默认使用某个变量传入参数,这个键名与执行方法变量名相同,那么系统就会根据传入的参数,在执行方法内使用依赖注入方式实例化一个模型,而实例化的方法,恰恰就是传入的参数的查询结果集。
说了半天很绕对不对?看一个例子就明白了:
Route::get('conferences/{conference}', function (Conference $conference) {
return view('conferences.show')->with('conference', $conference);
});
简单地说,路由地址内的变量 {conference} 跟执行方法变量名 $conference 撞名了,这个时候系统就会想了,这是要用隐式的绑定模式啊。于是,把 {conference} 的值,作为查询条件,使用执行方法内的模型 Conference 实例化并执行查询结果,并赋值给 $conference 变量。
自定义键名
而路由内这个 {conference} 传什么数值呢?根据系统默认值,就是 ID。如果你不想用 ID,想用别的列字段进行查询,那也可以,比如这样写:
Route::get('conferences/{conference:title}', function (Conference $conference) {
return view('conferences.show')->with('conference', $conference);
});
那么实例化的时候,就认为这个位置参数传的是 title 字段用于查询的条件。
懒人写法
如果整个模型默认都不会用 id 这个字段查询,那么在模型内重载实现下述方法即可:
public function getRouteKeyName()
{
return 'title';
}
如果需要修改的路由模型绑定字段太多,又不想挨个去写模型文件,可不可以集中起来管理呢?是可以的,在文件 AppProvidersRouteServiceProvider 内手动追加类似以下代码:
public function boot(Router $router)
{
parent::boot($router);
$router->model('title', Conference::class);
}
在此处写了,模型内就不用手动实现 getRouteKeyName 方法了。
写在最后
本文讲了一个再实际工程中用的甚至不是太多的一个功能——路由模型绑定,却能为大家打开思路提供很多帮助。
诸位还记得之前章节我们介绍的使用 slug 方式查询数据集吗?那正是典型的路由模型绑定。有兴趣的同学可以往前翻一番图文,或关键词搜索 slug 就可以愉快地延伸阅读了。
Happy coding :-)
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者
- Gym 100952A&&2015 HIAST Collegiate Programming Contest A. Who is the winner?【字符串,暴力】
- [开源,学习,分享]UWP第三方简书客户端分享
- HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
- 51 Nod 1057 N的阶乘【Java大数乱搞】
- 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】
- 2017 Multi-University Training Contest - Team 1 1001&&HDU 6033 Add More Zero【签到题,数学,水】
- 51 Nod 1005 大数加法【Java大数乱搞,python大数乱搞】
- 51 Nod 1029 大数除法【Java大数乱搞】
- 51 Nod 1027 大数乘法【Java大数乱搞】
- SQL常用的基础语法
- 51 Nod 1028 大数乘法 V2【Java大数乱搞】
- Gym 100952J&&2015 HIAST Collegiate Programming Contest J. Polygons Intersection【计算几何求解两个凸多边形的相交面积板子题
- Windows下Cygwin可以使用哪些Linux命令
- Codeforces Round #426 (Div. 2)【A.枚举,B.思维,C,二分+数学】
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Android开发中超好用的正则表达式工具类RegexUtil完整实例
- Android ijkplayer的使用方法解析
- Android开发实现查询远程服务器的工具类QueryUtils完整实例
- 解决android studio 3.0 加载项目过慢问题–maven仓库选择
- Android实现朋友圈点赞列表
- Kotlin基本类型自动装箱一点问题剖析
- Kotlin入门教程之开发环境搭建
- Android:Field can be converted to a local varible.的解决办法
- Android使用多线程进行网络聊天室通信
- android实现banner轮播图无限轮播效果
- Android CheckBox中设置padding无效解决办法
- Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法
- Android手势左右滑动效果
- Android开发实现根据包名判断App运行状态的方法
- Android实现朋友圈多图显示功能