【发布时间】:2015-08-27 13:11:16
【问题描述】:
我已经在我的应用程序上进行了 eloquent-sluggable 的工作。蛞蝓保存得很好。 Buuuut...如何使用它来创建漂亮的 url?
如果可能,我想在我的网址中使用它们而不是 ID 号。
【问题讨论】:
-
基本上一切都归结为您的路线。您仍然需要创建指定 slug 的路线,例如
Route::get('/home/{slug}' , function(){ });
我已经在我的应用程序上进行了 eloquent-sluggable 的工作。蛞蝓保存得很好。 Buuuut...如何使用它来创建漂亮的 url?
如果可能,我想在我的网址中使用它们而不是 ID 号。
【问题讨论】:
Route::get('/home/{slug}' , function(){ });
对于未来的读者,从 Laravel 8.0 开始,您可以在路径中指定一列
Route::get('/users/{user:slug}', function (User $user) {
return $user->bio;
});
【讨论】:
从 Laravel 5.2 开始,如果你使用路由模型绑定,那么你可以像往常一样让你的路由包含对象标识符(隐式绑定)。例如:
在routes/web.php (Laravel 5.3) 或 app/Http/routes.php (Laravel 5.2) 中:
Route::get('categories/{category}', 'CategoryController@show');
在你的CategoryController:
show (Category $category) {
//
}
您唯一需要做的就是告诉 Laravel 从不同的列中读取标识符,例如 slug 列,方法是在您的 eloquent 模型中自定义键名:
/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}
现在,您可以引用您的 url,它需要带有 slug 标识符的对象标识符,而不是 id 一个。
【讨论】:
是的,您可以在您的route 中使用slug 并生成url,例如,如果您声明这样的路由:
Route::get('users/{username}', 'UserController@profile')->where('profile', '[a-z]+');
然后在你的控制器中,你可以像这样声明方法:
public function profile($username)
{
$user = User::where('username', $username)->first();
}
username 是你的 slug,它必须是一个字符串,因为路由声明中的 where()...。如果传递了integer,则无法找到route,并抛出404 错误。
【讨论】: