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

使用laravel路由在url中显示名称而不是id,laravel,routes,Laravel,Routes,我在laravel 4中定义了一条如下所示的路线: Route::get('/books/{id}', 'HomeController@showBook'); 例如,在显示/books/1的url中,现在我想问的是,是否有一种方法可以显示图书的名称,但也可以将id作为搜索引擎优化的参数保存在路由中 提前感谢您可以向url添加任意数量的参数,如下所示: Route::get('/books/{id}/{name}', 'HomeController@showBook'); Route::get

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

Route::get('/books/{id}', 'HomeController@showBook');
例如,在显示/books/1的url中,现在我想问的是,是否有一种方法可以显示图书的名称,但也可以将id作为搜索引擎优化的参数保存在路由中


提前感谢

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

Route::get('/books/{id}/{name}', 'HomeController@showBook');
Route::get('books/{name}', function($name){
    $url = explode("-", $name);
    $id = $url[0];
    return "Book #$id";
});
现在,如果要创建此页面的url,可以执行以下操作:

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

如果您确定永远不会有两本书具有相同的标题,您可以在url中使用该书的名称。您只需执行以下操作:

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

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

您也可以这样做:

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

所以,如果您传递一个url,比如:
http://website.url/books/1-book-name

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

public function show(Blog $blog)
{
    return view('dashboard.Blog.show',compact('blog'));
}
Route::get('blog/{blog}', [\App\Http\Controllers\BlogController::class,'show'])->name('show');
在web.php中添加此

public function show(Blog $blog)
{
    return view('dashboard.Blog.show',compact('blog'));
}
Route::get('blog/{blog}', [\App\Http\Controllers\BlogController::class,'show'])->name('show');
然后将其添加到您的模型中(我使用博客作为我的模型)

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

不客气。

我想你误解了我想做的事。。在url栏中,我不希望url看起来像/books/1,而是/book/name of book。你的答案有用吗?我真的不喜欢这样做,我想坚持用id作为参数,从数据库中查找这本书。但是,如果你不想在地址栏中显示id,你就不能凭空找到id。你需要根据书的名字来查找它。我认为应该有一个解决方案,将id作为参数发送到操作,但在地址栏中显示它的名字。Laravel非常灵活,可以提供此功能。。只是需要幸运地发现,在http请求中不可能以任何其他方式添加id,您只有url提供给您的数据。所以拉威尔不能这么做。您可以尝试的唯一其他选项是通过post数据发送id,但是您需要为每个链接提供一个表单,或者使用查询字符串将它们添加到url,但这些都不利于SEO。