使用Laravel 5.2处理项目,并尝试实现SEO友好网址并从网址中删除id方面。
通常你会做这样的事情:
Route::resource('post', 'PostsController');
你将在网址“www.mywebsite.com/post/12” - 帖子的ID 现在,如果我将其替换为其标题,在我的控制器中,我现在必须在数据库中按标题搜索。如果有两个帖子具有相同的标题,我会收到一个错误,因为它找到了多个记录
所以我的问题是,我如何允许帖子中的相同标题与SEO友好网址一起使用,并且仍然通过控制器显示方法中的ID或其他内容搜索。
提前感谢您的帮助。
答案 0 :(得分:1)
如评论中所述,您可以向数据库表中添加名为unique
的{{1}}列。
一种方法是创建列slug
,然后在创建nullable
后生成slug。
在Post
模型中添加以下内容:
Post
因此,一旦创建了/**
* Boot the model
*/
public static function boot()
{
static::created(function ($post) {
$post->generateSlug();
});
}
/**
* Generate the slug for the newly created Post
*/
protected function generateSlug()
{
$slug = str_slug($this->slug);
if (static::slug($slug)->exists()) {
$slug .= '-' . $this->id;
}
$this->slug = $slug;
$this->save();
}
/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}
/**
* Constrain the query to the provided slug
*
* @param $query
* @param $slug
* @return mixed
*/
public function scopeSlug($query, $slug)
{
return $query->where('slug', $slug);
}
,就会调用Post
方法。这将使generateSlug
的标题脱颖而出。然后,我们会快速检查一下Post
是否已经有一个slug,因此它只会将Post
的{{1}}追加到它的末尾。然后它会保存它。
id
方法仅表示您的Post
Laravel将自动使用getRouteKeyName
字段而不是Route::resource
来解析模型。
显然,您可以随意更改slug
独有的方式,我只是使用了id
,因为它只是一个简单的例子。
希望这有帮助!
答案 1 :(得分:0)
您可以将id保留在url中,并使用id和slug更改路由,这样,如果您有任何具有id的链接,将使用slug重定向到相应的正确url。
您可以阅读this article以获得一些详细的想法。 诸如Stackoverflow,medium之类的网站也遵循类似的方法来使URL SEO变得友好。