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 】
相关推荐:
简历在线制作网站免费版,如何创建个人简历?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
如何快速上传自定义模板至建站之星?
如何快速搭建个人网站并优化SEO?
Laravel如何与Inertia.js和Vue/React构建现代单页应用
,网页ppt怎么弄成自己的ppt?
Java垃圾回收器的方法和原理总结
C#如何调用原生C++ COM对象详解
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
如何在万网自助建站中设置域名及备案?
,在苏州找工作,上哪个网站比较好?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
如何利用DOS批处理实现定时关机操作详解
JavaScript如何实现倒计时_时间函数如何精确控制
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
海南网站制作公司有哪些,海口网是哪家的?
如何用狗爹虚拟主机快速搭建网站?
Linux系统命令中tree命令详解
EditPlus中的正则表达式实战(6)
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel如何记录自定义日志?(Log频道配置)
php结合redis实现高并发下的抢购、秒杀功能的实例
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Thinkphp 中 distinct 的用法解析
韩国服务器如何优化跨境访问实现高效连接?
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
网站制作壁纸教程视频,电脑壁纸网站?
Laravel storage目录权限问题_Laravel文件写入权限设置
装修招标网站设计制作流程,装修招标流程?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何在云主机快速搭建网站站点?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
如何在搬瓦工VPS快速搭建网站?
制作公司内部网站有哪些,内网如何建网站?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
敲碗10年!Mac系列传将迎来「触控与联网」双革新
如何在IIS中新建站点并配置端口与IP地址?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
Laravel如何构建RESTful API_Laravel标准化API接口开发指南


non-object