使用 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 属性应该是唯一的。
我在 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 属性应该是唯一的。