Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
发布时间 - 2025-12-26 00:00:00 点击率:次必须存。slug字段需存入数据库以支持主键查询、保持URL历史一致性和SEO友好性;Eloquent-Sluggable默认写入,需在迁移中定义唯一字符串字段并配置模型的sluggable方法,启用onUpdate和正确设置source及separator,中文需手动转拼音或处理编码,路由查找需重写getRouteKeyName返回'slug'。
slug字段该不该存进数据库
必须存。虽然可以运行时动态生成,但会导致无法用 slug 做主键查询、丢失历史 URL 一致性、SEO 友好性归零。Eloquent-Sluggable 默认就是写入数据库的 slug 字段,前提是你的 migration 里已定义:
php artisan make:migration add_slug_to_posts_table --table=posts
$table->string('slug')->unique()->nullable();注意加 unique() 约束,否则重复 slug 会抛出 Illuminate\Database\QueryException。
安装 eloquent-sluggable 后怎么配置模型
不是装完包就能用,必须显式配置模型。以 Post 模型为例,需实现 Sluggable 接口并定义 sluggable() 方法:
use Cviebrock\EloquentSluggable\Sluggable;
class Post extends Model implements SluggableInterface
{use Sluggable;
public function sluggable(): array
{return [
'slug' => [
'source' => 'title',
'onUpdate' => true,
'separator' => '-',
]
];
}
}关键点:
-
onUpdate设为true才会在$post->title改变时自动更新 slug;默认是 false -
separator影响生成效果,比如设成'_'就会输出hello_world而非hello-world - 若 source 是多个字段(如
['title', 'category.name']),需确保关联已预加载,否则报Trying to get property 'name' of
non-object
中文标题生成 slug 失败或全是问号
默认配置不支持中文。Eloquent-Sluggable 底层用的是 str_slug()(Laravel 8+ 已废弃)或 Str::slug(),它们依赖 iconv 或 mb_convert_kana 做 ASCII 转换,而中文未做映射时直接被过滤为空。解决方法是改用自定义源:
public function sluggable(): array
{return [
'slug' => [
'source' => function () {return mb_convert_kana($this->title, 'as'); // 先转全角/半角
},
'onUpdate' => true,
]
];
}更稳妥的做法是引入
cviebrock/eloquent-sluggable 的 sluggableSource 钩子,或在保存前手动处理:$post->slug = Str::slug(pinyin($post->title)); // 需配合 overtrue/pinyin 包否则你看到的只会是空字符串或一串
-。
路由中通过 slug 查找模型却 404
常见错误是没重写 getRouteKeyName()。Laravel 默认按 id 查,即使 URL 是 /post/hello-world,它仍会执行 WHERE id = 'hello-world'。必须在模型里声明:
public function getRouteKeyName(): string
{return 'slug';
}否则无论 slug 字段是否存在、是否唯一,都查不到。另外确认路由定义用了隐式绑定:
Route::get('/post/{post}', [PostController::class, 'show']);而不是 {post:id} 或硬编码参数名。如果用了 where('post', '[A-Za-z0-9\-]+') 却漏了 \- 转义,正则会截断 slug,导致部分路径匹配失败。
# php
# laravel
# go
# seo
# 编码
# 路由
# 解决方法
# Object
# 字符串
# 接口
# Property
# ASCII
# database
# 数据库
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅谈Javascript中的Label语句
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
nginx修改上传文件大小限制的方法
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
HTML 中动态设置元素 name 属性的正确语法详解
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
使用C语言编写圣诞表白程序
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
简历在线制作网站免费版,如何创建个人简历?
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Laravel中的withCount方法怎么高效统计关联模型数量
制作电商网页,电商供应链怎么做?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
Java遍历集合的三种方式
如何在万网自助建站中设置域名及备案?
网站页面设计需要考虑到这些问题
网站建设保证美观性,需要考虑的几点问题!
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何快速登录WAP自助建站平台?
微信小程序 配置文件详细介绍
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel中的Facade(门面)到底是什么原理
jQuery 常见小例汇总
浅述节点的创建及常见功能的实现
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
简单实现jsp分页
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
如何续费美橙建站之星域名及服务?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
JS中对数组元素进行增删改移的方法总结
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
如何在万网开始建站?分步指南解析
如何彻底卸载建站之星软件?
如何在服务器上三步完成建站并提升流量?
Laravel怎么连接多个数据库_Laravel多数据库连接配置
如何用西部建站助手快速创建专业网站?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
智能起名网站制作软件有哪些,制作logo的软件?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
西安专业网站制作公司有哪些,陕西省建行官方网站?


non-object