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(),它们依赖 iconvmb_convert_kana 做 ASCII 转换,而中文未做映射时直接被过滤为空。解决方法是改用自定义源:

public function sluggable(): array
{
    return [
        'slug' => [
            'source' => function () {
                return mb_convert_kana($this->title, 'as'); // 先转全角/半角
            },
            'onUpdate' => true,
        ]
    ];
}
更稳妥的做法是引入 cviebrock/eloquent-sluggablesluggableSource 钩子,或在保存前手动处理:
$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模型事件监听与解耦开发【指南】  西安专业网站制作公司有哪些,陕西省建行官方网站?