3分钟短文:Laravel slug,让你的url地址更“好记”
引言
网络资源访问,路由是多么重要不消多言了。而友好的url地址更是能让人一目了然,增加用户的好感。同时对于爬虫也是好的示例,搜索引擎可以友好地展开工作了。
本文就来讲讲,如何在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 CviebrockEloquentSluggableSluggable;
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 CviebrockEloquentSluggableSluggable;
use CviebrockEloquentSluggableSluggableScopeHelpers;
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 :-)
- Python读取json文件,并转化为字典进行提取字段(出现索引must be int,not str)解决方案
- Python 把字典的key和value的值取出来,按照顺序存入到list中
- Go语言 如果实现http重连?
- python strip()函数 删除字符串中无空白字符或者是无用字符
- 闪回归档的简单测试(r8笔记第68天)
- sql语句查询到整个数据库的容量
- 神奇的go语言
- 备库查询导致的ORA-01110错误及修复(r8笔记第67天)
- SQL客户端DBvisualize直接导入数据出现中文乱码
- Python基础整理操作积累
- 让AI给颜值打分?应该是最公正的裁判了!
- orion的简单测试 (r8笔记第75天)
- golang ftp客户端示例 支持断点续传
- python 网页特征提取XPATH(两天玩转) 第一天
- 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
- k8s 代码走读---client-go 编程交互测试代码
- C#网络类智能开关控制板实例
- Flume拦截器实现按照事件时间接入HDFS
- Day4.Linux用户权限
- 如何使用Canal同步MySQL的Binlog到Kafka
- Go 每日一库之 gabs
- 如何将Flink应用的日志发送到kafka
- 锦囊篇|Java中的SPI机制
- webpack实战——生产环境配置【上】
- 深度阅读之《Concurrency in Go》
- 为了不让代码看起来像一坨* 我在工作中反复用了这个
- 在 Go 语言中 Patch 非导出函数
- SpringCloud 配置中心服务端配置解析流程分析
- Qt多线程编程之线程池
- PWN:Tcache Attack原理