2 回答
TA贡献1796条经验 获得超7个赞
您可以为 Posts 表添加一个唯一的slug列,然后将其用作路由中的参数,例如'/posts/{slug}'.
您可以在 Post 模型中为此添加一个 mutator:
public function setTitleAttribute($title)
{
$this->attributes['slug'] = str_slug($title);
$this->attributes['title'] = $title;
}
TA贡献1772条经验 获得超5个赞
我的建议是在您的Post模型上实现一个 slug 字段,并将其用作路由模型绑定的键。
要对帖子标题进行 slugify,请使用 Laravel 的 Muttators 将帖子标题转换为 URL 友好的 slug。
为确保 slug 是唯一的,您可以将时间戳附加到 slug,在删除列冲突的同时保留 SEO。
/**
* Set the post's slug.
*
* @return void
*/
public function setSlugAttribute()
{
$this->attributes['slug'] = Str::slug($this->attributes['title']) . dechex(time());
}
创建 slug 字段后,您可以通过覆盖模型中的getRouteKeyName方法将其绑定到路由Post。
public function getRouteKeyName()
{
return 'slug';
}
你的路线会变成这样
Route::get('posts/{post}', 'PostsController@getPost');
参考:路由模型绑定: https : //laravel.com/docs/5.8/routing#route-model-binding Slug Helper: https: //laravel.com/docs/5.8/helpers#method-str-slug Eloquent Mutators: https://laravel.com/docs/5.8/eloquent-mutators
- 2 回答
- 0 关注
- 200 浏览
添加回答
举报