首先,我在数据库中有 Article 模型和文章表。每篇文章都可以使用Laravel的标准URI结构显示:www.example.com/articles/5
(5
文章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
。
另一方面,每篇文章属于一个类别。例如,假设有以下类别:
我使用 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
(其中1
是id
)。如果我们将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?
答案 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是否正确。如果网址中的类别不相关,它仍会加载,您需要在控制器逻辑中处理这些类别。