3分钟短文:Laravel让你的url地址更“好记”

引言

网络资源访问,路由是多么重要不消多言了。而友好的url地址更是能让人一目了然,增加用户的好感。同时对于爬虫也是好的示例,搜索引擎可以友好地展开工作了。

img

本文就来讲讲,如何在laravel中构造友好的url路由。

啥是slug?

在早期的互联网时代,为了在页面之间传递数据,复杂的交互一般都会使用cookie等本地缓存,但是浏览器版本的约束,使得服务器端交互仍然需要即时访问。所以各种各样的url地址,带参数跳转的,表单提交的,混为一谈,制作出符合统一规范的路由很不容易。

比如下面的路由,访问一个地址,并且携带querystring参数:

http://example.com/events.php?id=42

相应地,不同的用户,这个id也不相同。不同的页面,也不相同。像这样带参传递的路由地址,是最为原始的。我们在之前的章节已经使用laravel Route功能,重新构造了url,所以访问起来像是连贯的:

http://example.com/events/42

直接使用位置参数绑定的方式传递。因为数字42对用户而言没有实际意义,而对数据库来说是索引字段。如果使用如下方式,效果要友好的多:

http://example.com/events/laravel-hacking-and-coffee

这种基于字符串位置参数绑定的URL方式,被称为 slug。有一个第三方类库专门用于url的友好化。使用 composer 安装:

composer require cviebrock/eloquent-sluggable:^4.3

模型引入 Slug 功能

引入 eloquent-sluggable 类库,只需要在laravel模型文件内引入对应trait,并重载实现sluggable方法:

use Cviebrock\EloquentSluggable\Sluggable;
class Event extends Model {
    use Sluggable;
    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'name'
            ]
        ];
    }
}

上述 sluggable 方法指定了,哪个字段用于slug搜索,(此处是 slug)。以及slug字段对应的数据库表的字段来源,此处是 name 字段。

接着我们需要修改 events 表,为其追加 slug 字段。命令行创建迁移文件:

php artisan make:migration add_slug_column_to_events_table --table=events

执行成功返回:

Created Migration: 2020_10_04_225240_add_slug_column_to_events_table

然后手动实现迁移文件的 up 方法:

public function up()
{
    Schema::table('events', function (Blueprint $table) {
        $table->string('slug')->nullable();
    });
}

以及回滚使用的 down 方法:

public function down()
{
    Schema::table('events', function (Blueprint $table) {
        $table->dropColumn('slug');
    });
}

在命令行执行迁移成功后,数据库表events就会追加上slug字段了。

如果原来数据库表内已经又生产数据,此时我们需要手动更新一下。使用 tinker 快捷操作:

namespace App;
$events = Event::all();
foreach($events as $event) {
    $event->save();
}

数据量不大,我们也不考虑效率不效率的问题了。foreach循环直接用了。

创建基于 slug 的模型查询

数据库准备好了,模型准备好了,现在让我们把slug功能用起来。

如果你有印象的话,应该会记得laravel模型的find等方法,是基于primary key进行索引,以便加快查询速度。拿到模型的ID,查询该条目数据,然后返回模型实例。这是基于ID这个integer类型的查询。

而slug查询,是基于字符串的,如果要使用slug此功能,需要改写默认的列名。在模型文件内手动重写如下方法:

public function getRouteKeyName()
{
    return 'slug';
}

返回字符串,就是查询所依据的“字段名”。这样默认的查询就不走默认的 $primaryKey = 'id' 这个字段,而是使用手动指定的 slug字段了。

当然了,如果没有使用路由参数绑定,eloquent-sluggable类库也为我们提供了友好的trait,在模型文件内直接引入就好了:

use Cviebrock\EloquentSluggable\Sluggable;
use Cviebrock\EloquentSluggable\SluggableScopeHelpers;

class Event extends Model
{
    use Sluggable, SluggableScopeHelpers;
}

从名字你就能猜测的到,SluggableScopeHelpers 是一个全局作用域文件,这是我们上一章所讲内容,不再赘述。

完成引入后,在使用模型进行查询时,就可以这样使用了:

$event = Event::findBySlug('laravel-hacking-and-coffee');
$event = Event::findBySlugOrFail('laravel-hacking-and-coffee');

归根结底,就是使用slug字段记录查询的字符串,而slug字段在对应关系中定义为 source => ‘name’ 字段,所以SQL查询仍然是根据slug字段严格匹配约束返回数据集。

数据量大了之后,这种等于的WHERE子句性能必然不如ID字段的主键索引来的快。所以在数据库层面也同样需要优化。

写在最后

本文介绍了在模型文件内,引入slug的功能,并通过修改模型的查询方式,让模型的默认查询方式修改为通过字符串进行查询,从而可以在路由文件内构造更友好的查询url。

Happy coding :-)

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

🏆 掘金技术征文|双节特别篇

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351