如何实现Laravel 5中的“slug()”?

时间:2016-01-23 14:11:55

标签: php laravel

我想映射这种类型的路线:

/images/united-states/san-francisco

在我的routes.php文件中,我写道:

Route::get('/images/{country_slug}/{city_slug}', 'ImageController@listByCountryAndCity');

在我的控制器中:

public function listByCountryAndCity($country, $city)
{
    return Image::where('country', $country)->where('city', $city)->paginate();
}

在比较之前,如何 slug 国家/地区

我不想添加任何其他名为国家/地区城市

的表格

3 个答案:

答案 0 :(得分:3)

你不能,至少不能以任何可靠的方式。

因为标题可以包含不是URL安全的特殊字符,并且如果您使用例如str_slug来生成slug,那么这些特殊字符将被删除,因此您将无法重建标题对于查询条件,因为会丢失字符。

所以唯一的解决方案是在数据库中有一个slug列,这是一个很好的解决方案。如果您认为为slug添加额外的列是多余的,它不是。虽然标题和URL slug是相似的(并且在这种情况下彼此依赖),但它们是两个独立的实体,并且它们只是合乎逻辑地对待它们。

拥有slug列可提供您需要的确切功能,还可以为条目设置任何自定义slug,而不仅仅是从标题生成的。

答案 1 :(得分:2)

在像你这样的情况下,我会做这样的路线:

Route::get('/post/{id}-{slug}', 'PostController@show');

在你的控制器中:

public function show($id, $slug)
{
    return Post::find($id);
}

所以slu is仅适用于SEO,你只能使用$id

或者,你可以创建一个范围:

public function scopeFindBySlug($query, $title)
{
    $query->where('slug', '=', str_slug($title));
}

Post::findBySlug($title)->first();

答案 2 :(得分:0)

您可以使用laravel函数str_slug($string)中的构建。

但请注意,此功能不会检查slug是否已被占用。它只是将你的字符串转换成一个slug。