Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >3分钟短文:Laravel slug,让你的url地址更“好记”

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

原创
作者头像
程序员小助手
修改于 2020-10-09 03:08:37
修改于 2020-10-09 03:08:37
3.8K0
举报
文章被收录于专栏:程序员小助手程序员小助手

引言

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

img
img

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

啥是slug?

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

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

代码语言:txt
AI代码解释
复制
http://example.com/events.php?id=42

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

代码语言:txt
AI代码解释
复制
http://example.com/events/42

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

代码语言:txt
AI代码解释
复制
http://example.com/events/laravel-hacking-and-coffee

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

代码语言:txt
AI代码解释
复制
composer require cviebrock/eloquent-sluggable:^4.3

模型引入 Slug 功能

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

代码语言:txt
AI代码解释
复制
use Cviebrock\EloquentSluggable\Sluggable;
class Event extends Model {
    use Sluggable;
    public function sluggable()
    {
        return [
            'slug' => [
            	'source' => 'name'
            ]
        ];
    }
}

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

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

代码语言:txt
AI代码解释
复制
php artisan make:migration add_slug_column_to_events_table --table=events

执行成功返回:

代码语言:txt
AI代码解释
复制
Created Migration: 2020_10_04_225240_add_slug_column_to_events_table

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

代码语言:txt
AI代码解释
复制
public function up()
{
    Schema::table('events', function (Blueprint $table) {
    	$table->string('slug')->nullable();
    });
}

以及回滚使用的 down 方法:

代码语言:txt
AI代码解释
复制
public function down()
{
    Schema::table('events', function (Blueprint $table) {
    	$table->dropColumn('slug');
    });
}

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

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

代码语言:txt
AI代码解释
复制
namespace App;
$events = Event::all();
foreach($events as $event) {
    $event->save();
}

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

创建基于 slug 的模型查询

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

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

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

代码语言:txt
AI代码解释
复制
public function getRouteKeyName()
{
	return 'slug';
}

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

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

代码语言:txt
AI代码解释
复制
use Cviebrock\EloquentSluggable\Sluggable;
use Cviebrock\EloquentSluggable\SluggableScopeHelpers;

class Event extends Model
{
	use Sluggable, SluggableScopeHelpers;
}

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

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

代码语言:txt
AI代码解释
复制
$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 :-)

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
3分钟短文:说说Laravel模型关联关系最单纯的“一对一”
关系型数据库提供了非常好用的数据关联绑定模式,使用SQL语句可以方便地进行关联数据查询和操作。
程序员小助手
2020/10/12
2.1K0
3分钟短文:说说Laravel模型关联关系最单纯的“一对一”
3分钟短文:太爽了,用Laravel写API接口!
我们一直在讲,通过路由传达到控制器,处理好数据并渲染到视图,但是对于现代的应用, 前后端分离的情况下,后端写个接口就完事儿了。
程序员小助手
2020/10/18
2.4K0
3分钟短文:太爽了,用Laravel写API接口!
3分钟短文:Laravel说要用软删除,可不要真删
我们不止一次在系列文章中讲到模型的“软删除”功能,因为现实场景中为了保证数据可追溯,我们几乎不会对数据库进行物理删除。删除数据有可能会造成数据一致性的破坏,进而导致业务逻辑无法跑通。所以,软删除的概念,极为重要。
程序员小助手
2020/10/08
2.4K0
3分钟短文:说说Laravel模型中还算常用的2个“关系”
上一章我们介绍了比较简单的laravel模型关联关系中的一对一,介绍了关联操作方法。
程序员小助手
2020/10/13
2.3K0
3分钟短文:说说Laravel模型中还算常用的2个“关系”
3分钟短文:为了你少跳坑,Laravel写好了用户授权
为了留存用户,我们会想尽办法获取用户的注册,并将其留在应用内。 laravel开发好了一部分用户注册和登陆的代码,如果图省事不要二次开发的, 拿来用就可以了。而如果要深度定制用户权限的开发者,也非常有必要了解用户和授权相关的内容。
程序员小助手
2020/10/16
9760
3分钟短文:为了你少跳坑,Laravel写好了用户授权
3分钟短文:书接上回,Laravel数据库迁移的那些个小技巧
使用laravel的数据库迁移功能进行表的创建,和迁移回滚之后,我们继续说说在设计中
程序员小助手
2020/09/29
1.8K0
3分钟短文:书接上回,Laravel数据库迁移的那些个小技巧
3分钟短文:Laravel ORM 模型用法纲要
前两期为了说明laravel框架提供的数据库操作能力,直接使用DB门面操作, 而没有引入更为强大的eloquent orm功能。从本期开始,我们就分次把 eloquent的一些简要知识点,为大家提炼演示一下。主要以代码为主,配以简要说明。
程序员小助手
2020/09/10
8460
3分钟短文:Laravel Form,让你不再写 HTML 的好“库”
作为后端工程师的你,是不是面对一堆JS,CSS感觉无比抓狂。如果能摆脱大量的冗余的HTML代码块,
程序员小助手
2020/10/09
1.4K0
3分钟短文:Laravel Form,让你不再写 HTML 的好“库”
Laravel基础二之Migrations和验证
新的迁移文件会被放置在 database/migrations 目录中。每个迁移文件的名称都包含了一个时间戳,以便让 Laravel 确认迁移的顺序。 --table 和 --create 选项可用来指定数据表的名称,或是该迁移被执行时是否将创建的新数据表。
唐成勇
2019/05/26
1.8K0
Laravel 模型事件的应用
在日常处理一些用户操作事件时,我们有时候需要记录下来,方便以后查阅,或者大数据统计。
seth-shi
2023/12/18
3210
Laravel 模型事件的应用
3分钟短文:素未谋面,Laravel数据库模型初阶入门
模型是在代码中抽象一层,把数据库操作提取出来。laravel支持常用的数据库产品,
程序员小助手
2020/09/28
1K0
3分钟短文:素未谋面,Laravel数据库模型初阶入门
3分钟短文:一看就是干货!Laravel迁移数据库!
书接上回。我们讲完了路由,又顺带讲了中间件;接着又讲了控制器,还把路由的数据发到控制器,并且渲染到视图页面。更深入的是,把视图文件的模板也说明白了。
程序员小助手
2020/10/28
1.2K0
3分钟短文:一看就是干货!Laravel迁移数据库!
3分钟短文:任命管理员,给Laravel普通用户提权
系统内使用User表记录用户的属性,各自维护用户自身的关联数据。 有一些前端页面也会需要分别根据身份展示不同级别的内容。
程序员小助手
2020/10/17
5660
3分钟短文:任命管理员,给Laravel普通用户提权
Laravel 7 新特性-路由的趟坑之路(自定义键名以及作用域)
Laravel 7 开始新增了一些新特性,今天我们来讲解下 路由绑定的新用法,自定义键名(slug)以及作用域(范围限定)
hedeqiang
2020/03/23
2.6K0
Laravel 7 新特性-路由的趟坑之路(自定义键名以及作用域)
3分钟短文:可能是Laravel模板最直白的用法了,没有之一
上一期我们通过分配路由地址,在url中接收位置参数并传递给控制器方法, 并且在控制器内简单地打印输出接收的参数。
程序员小助手
2020/09/25
2.1K0
3分钟短文:可能是Laravel模板最直白的用法了,没有之一
Laravel 5 系列入门教程(一)【最适合中国人的 Laravel 教程】
2. http://www.golaravel.com/laravel/docs/5.0/
竹清
2018/08/31
3.7K0
30分钟用Laravel实现一个博客
控制器方面 app/Http/Controllers/ 我们修改一下 HomeController.php
猿哥
2019/11/13
7.8K0
orm 系列 之 Eloquent使用1
本文会是一个Eloquent的使用教程,在此之前,我们先讲述下怎么搭建环境,完整的系列请查看orm
zhuanxu
2018/08/23
1.9K0
orm 系列 之 Eloquent使用1
通过 Laravel Eloquent 模型实现批量赋值和软删除
在上一篇教程中,我们基于 Eloquent 模型实现了对数据表记录的增删改查操作,今天我们在此基础上介绍两个 Eloquent 模型提供的高级功能 —— 批量赋值和软删除。
学院君
2021/01/22
2.6K0
3分钟短文:Laravel 从软删除说到模型作用域的概念
上一节我们讲了通过模型方法新建条目,或者更新数据。对于写操作还有更为重要的一个方法, 就是数据的删除。删除数据,有物理删除和软删除的区别。
程序员小助手
2020/09/11
1.5K0
3分钟短文:Laravel 从软删除说到模型作用域的概念
推荐阅读
相关推荐
3分钟短文:说说Laravel模型关联关系最单纯的“一对一”
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档