使用 laravel 路由在 url 中显示名称而不是 id

show name instead of id in a url using laravel routing

我在 laravel 4 中定义了一条路线,如下所示:

Route::get('/books/{id}', 'HomeController@showBook');

在 url 中它显示 /books/1 例如,现在我想问的是有没有办法显示书名而不是将 id 作为参数保留在用于 SEO 目的的路线

提前致谢

您可以根据需要向 url 添加任意数量的参数,如下所示:

Route::get('/books/{id}/{name}', 'HomeController@showBook');

现在,当您要为该页面创建 url 时,您可以执行以下操作:

URL::action('HomeController@showBook', ['id' => 1, 'name' => 'My awesome book']);

更新:

如果您确定永远不会有两本书同名,您可以直接在url中使用书名。你只需要这样做:

Route::get('/books/{name}', 'HomeControllers@showBook');

在您的 showBook 函数中,您需要使用 name 而不是 id 从数据库中获取图书。我强烈建议您同时使用 ID 和名称,否则您可能会遇到麻烦,因为我认为书名不会始终是唯一的。

你也可以这样做:

Route::get('books/{name}', function($name){
    $url = explode("-", $name);
    $id = $url[0];
    return "Book #$id";
});

因此,如果您传递一个 url,您就可以通过 id 获取图书,例如:http://website.url/books/1-book-name

如果您使用 laravel 8,这可能会有所帮助。
在你的控制器中添加这个

public function show(Blog $blog)
{
    return view('dashboard.Blog.show',compact('blog'));
}

在你的web.php中添加这个

Route::get('blog/{blog}', [\App\Http\Controllers\BlogController::class,'show'])->name('show');

然后将其添加到您的模型中(我使用博客作为我的模型)

 public function getRouteKeyName()
{
    return 'title'; // db column name you would like to appear in the url.
}

注意:请让您的列名称是唯一的(良好做法)。
结果:http://127.0.0.1:8000/blog/HelloWorld .....url 单个博客
所以没有了 http://127.0.0.1:8000/blog/1
不客气。

您也可以使用模型绑定check more on laravel docs

例如

Route::get('book/{book:name}',[BookController::class,'getBook'])->name('book');

"book/{book:name}" 中的 name 属性应该是唯一的。