专栏首页程序员小助手3分钟短文:Laravel路由加模型等于?
原创

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';
}

如果需要修改的路由模型绑定字段太多,又不想挨个去写模型文件,可不可以集中起来管理呢?是可以的,在文件 App\Providers\RouteServiceProvider 内手动追加类似以下代码:

public function boot(Router $router)
{
    parent::boot($router);
    $router->model('title', Conference::class);
}

在此处写了,模型内就不用手动实现 getRouteKeyName 方法了。

写在最后

本文讲了一个再实际工程中用的甚至不是太多的一个功能——路由模型绑定,却能为大家打开思路提供很多帮助。

诸位还记得之前章节我们介绍的使用 slug 方式查询数据集吗?那正是典型的路由模型绑定。有兴趣的同学可以往前翻一番图文,或关键词搜索 slug 就可以愉快地延伸阅读了。

Happy coding :-)

我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 3分钟短文:Laravel ORM 模型用法纲要

    前两期为了说明laravel框架提供的数据库操作能力,直接使用DB门面操作, 而没有引入更为强大的eloquent orm功能。从本期开始,我们就分次把 elo...

    程序员小助手
  • 3分钟短文:Laravel模型OR查询避坑指南

    laravel模型提供了query builder对象用于组装查询条件并生成PSD查询语句,从而与数据库对话。如果使用and约束条件,这并不难写,无非是 A 成...

    程序员小助手
  • # 3分钟短文:Laravel路由注册,你必须掌握的“动词”!

    无论是web页面还是API接口,我们都绕不开的是路由地址,网络资源定位也只能依赖于路由地址,它是衔接网络请求与应用程序的桥梁。

    程序员小助手
  • 3分钟短文:Laravel路子真野啊!路由昵称前缀中间件

    上一章内容我们介绍了使用laravel路由动词定义方便的url,以及通过url参数绑定传递数据, 本文我们继续深入Route功能,学习一些提升生产力的方法,在现...

    程序员小助手
  • 3分钟短文 | Laravel 灵活地获取当前请求的路由地址

    Laravel程序上下文内,我们需要动态地获取当前的路由地址,应该怎么写呢?本文就通过从 Laravel 4 到 5 及以上版本的实现方法,带大家重温这一知识点...

    程序员小助手
  • 3分钟短文:Laravel模型读数据的那个“障眼法”

    先从最常用的地方着手,比如在迁移文件内使用的 timestamps方法,就是在表内生成 created_at和updated_at两个 datetime 类型的...

    程序员小助手
  • 3分钟短文:无私分享!Laravel模型使用2个小技巧

    上一节我们详细讲解了模型的访问器功能,可以轻易扩展模型的属性访问,灵活又标准地增强了模型的读取数据的能力。

    程序员小助手
  • 3分钟短文 | Laravel 获取模型查询生成的SQL语句

    在程序开发阶段,我们关注于业务逻辑,实现功能。而laravel提供了非常好的 debug 支持,只需在 env 文件内指定 debug = true ,就可以在...

    程序员小助手
  • 3分钟短文:素未谋面,Laravel数据库模型初阶入门

    模型是在代码中抽象一层,把数据库操作提取出来。laravel支持常用的数据库产品,

    程序员小助手

扫码关注云+社区

领取腾讯云代金券