我在laravel 4中定义了一条看起来如此的路线:
Route::get('/books/{id}', 'HomeController@showBook');
在网址中显示/ books / 1例如,现在我问的是有没有办法显示图书的名称而是要将id作为参数保留在路径中以供搜索引擎优化目的
提前致谢
答案 0 :(得分:0)
您可以根据需要在网址中添加任意数量的参数,如下所示:
Route::get('/books/{id}/{name}', 'HomeController@showBook');
现在,当您想要为此页面创建网址时,您可以执行以下操作:
URL::action('HomeController@showBook', ['id' => 1, 'name' => 'My awesome book']);
<强>更新强>
如果您确定永远不会有两本书具有相同的标题,您可以在网址中使用该书的名称。你只需要这样做:
Route::get('/books/{name}', 'HomeControllers@showBook');
在showBook
功能中,您需要使用name
代替id
从数据库中获取图书。我强烈建议同时使用id和名称,否则你会遇到麻烦,因为我不认为书名永远是唯一的。
答案 1 :(得分:0)
您也可以这样做:
Route::get('books/{name}', function($name){
$url = explode("-", $name);
$id = $url[0];
return "Book #$id";
});
因此,如果您传递的网址为:http://website.url/books/1-book-name
答案 2 :(得分:0)
如果您使用 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
不客气。