SEO友好的URL与category / subcategories / article slug? [Laravel]

时间:2016-06-20 16:07:36

标签: laravel seo laravel-5.2 friendly-url nested-sets

首先,我在数据库中有 Article 模型和文章表。每篇文章都可以使用Laravel的标准URI结构显示:www.example.com/articles/55文章id。)。每篇文章都有 slug 字段(文章表中的 slug 列),因此使用路径模型绑定时,它是很容易改变这一点,并在URI中有一个slug而不是id:

RouteServiceProvider.php 中我刚刚添加:

 public function boot(Router $router)
 {
    parent::boot($router);

    \Route::bind('articles', function($slug) {
        return \App\Article::where('slug', $slug)->firstOrFail();
    });
}

...现在我可以打开文章:www.example.com/articles/this-is-some-slug

另一方面,每篇文章属于一个类别。例如,假设有以下类别:

  • 政治
  • 运动
    • 足球
    • 网球
      • ATP
      • WTA
  • 文化

我使用 Baum (Laravel 5的Eloquent ORM的嵌套集模式的实现)创建了这些类别。所以数据库中有一个Category模型和categories表:

        $table->increments('id');
        $table->string('name');

        $table->integer('parent_id')->nullable();
        $table->integer('lft')->nullable();
        $table->integer('rgt')->nullable();
        $table->integer('depth')->nullable();

        $table->timestamps();

当然,在articles表中有一列category_id,因为一对多关系(一篇文章属于一个类别,一个类别可以有多个文章)。

属于某个类别的所有文章都可以通过以下网址显示:www.example.com/articles/category/1(其中1id)。如果我们将slug列添加到类别表&设置路线模型绑定

    \Route::bind('category', function($slug) {
        return \App\Category::where('slug', $slug)->firstOrFail();
    });

然后我们将使用slug而不是id:www.example.com/articles/category/politics(这将显示属于 politics 类别的所有文章。)

但是我希望URI具有以下结构:

  • www.example.com/sport/tennis/wta/article_slug(/ category / subcategory / subcategory / article_slug)
  • www.example.com/politics/article_slug(/ category / article_slug)

依旧......

问题是我不知道如何用Laravel做到这一点。它甚至可能吗?你会如何解决这个问题?

提前致谢,抱歉我的英语不好。

SEO友好网址与category / subcategories / article slug?

1 个答案:

答案 0 :(得分:3)

要生成example.com/category/subcategory/article的网址非常简单,但您显然希望添加多个子类别的复杂性。为此,我们需要查看route parameter regex constraints

在路线参数约束中使用正则表达式,您可以将子类别作为字符串获取,例如。 subcategory1/subcategory2然后通过另一个自定义绑定或直接传递给您的控制器。

以下是添加路径参数约束所需路线的示例:

// Route to closure
Route::get('/{category}/{subcategories}/{article}', function($category, $subcategories, $article) 
{
    return $subcategories;
})->where('subcategories', '(.*)');

// Route to controller method
Route::get('/{category}/{subcategories}/{article}', 'ArticlesController@show')->where('subcategories', '(.*)');

您的子类别参数的自定义绑定示例,它将子类别作为数组返回:

$router->bind('subcategories', function ($value) {
    return explode('/', $value);
});

警告:您将以您所描述的方式使用路径参数绑定遇到的唯一问题是,此处加载的文章仅取决于slug是否正确。如果网址中的类别不相关,它仍会加载,您需要在控制器逻辑中处理这些类别。