Laravel 5.6资源API路由如何用Slug替代ID访问?
用Slug替代ID访问Laravel 5.6资源接口的实现方法
嘿,我来帮你搞定这个需求!在Laravel 5.6里,要实现用slug代替默认ID访问资源,其实有两种很方便的方式,咱们一步步来:
方法一:修改模型的路由键名(全局生效)
Laravel的隐式路由模型绑定默认是用id字段来查找模型的,咱们只需要在Category模型里指定用slug作为路由匹配的键名就行:
// app/Category.php class Category extends Model { // 告诉Laravel,路由绑定的时候用slug字段来查找 public function getRouteKeyName() { return 'slug'; } }
这样改完之后,你原来的Route::resource路由不需要做任何修改,当用户访问/categories/my-slug时,Laravel会自动用slug字段去数据库匹配对应的分类,你的show方法里的隐式模型绑定依然能正常工作,完全不用改动Controller的代码~
方法二:自定义路由参数(仅当前路由生效)
如果你不想全局修改模型的路由键,或者只是想给这个分类路由单独设置,可以在定义资源路由的时候,通过parameters方法指定参数对应的字段:
// routes/api.php(或者web.php,看你的接口定义在哪) Route::resource('categories', 'CategoryController') ->middleware('cors') ->parameters([ 'categories' => 'slug' // 把categories参数对应到slug字段 ]);
这种方式同样不需要改动你的CategoryController和CategoryResource代码,Laravel会自动用slug去查找对应的模型实例。
重要注意事项
- 确保你的
categories数据表中存在slug字段,并且这个字段是唯一的(避免多个分类用同一个slug导致查找出错)。你可以在迁移文件里给slug字段加上唯一约束:
// 分类表的迁移文件 $table->string('slug')->unique();
- 如果slug是用户输入或者自动生成的,记得处理好重复的情况(比如用
Str::slug()生成唯一slug)。
内容的提问来源于stack exchange,提问作者devools
相关产品推荐
相关产品推荐

