SEO友好的URL Laravel

时间:2016-10-24 19:28:52

标签: php laravel laravel-5.2

使用Laravel 5.2处理项目,并尝试实现SEO友好网址并从网址中删除id方面。

通常你会做这样的事情:

Route::resource('post', 'PostsController');

你将在网址“www.mywebsite.com/post/12” - 帖子的ID 现在,如果我将其替换为其标题,在我的控制器中,我现在必须在数据库中按标题搜索。如果有两个帖子具有相同的标题,我会收到一个错误,因为它找到了多个记录

所以我的问题是,我如何允许帖子中的相同标题与SEO友好网址一起使用,并且仍然通过控制器显示方法中的ID或其他内容搜索。

提前感谢您的帮助。

2 个答案:

答案 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变得友好。