在 laravel 5 中使用 slug?

Using slugs in laravel 5?

我已经在我的应用程序上完成了 eloquent-sluggable 工作。鼻涕虫保存得很好。 Buuuut...我如何使用它来创建一个漂亮的url?

如果可能的话,我想在我的url中使用它们而不是身份证号码。

是的,您可以在 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 错误。

从 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';
}

现在,您可以使用 slug 标识符而不是 id 标识符来引用需要对象标识符的 url

Laravel 5.3 (or 5.2) Route Model Biding

对于以后的读者,从 Laravel 8.0 开始,您可以在路径中指定一个列

Route::get('/users/{user:slug}', function (User $user) {
    return $user->bio;
});