【发布时间】:2015-03-06 08:01:25
【问题描述】:
我在 laravel 4 中定义了一个看起来像这样的路由:
Route::get('/books/{id}', 'HomeController@showBook');
在 url 例如它显示 /books/1 ,现在我问有没有办法显示书名,但也将 id 作为参数保留在路由中以用于 SEO 目的
提前致谢
【问题讨论】:
我在 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 和 name,否则你会遇到麻烦,因为我认为书名不会总是唯一的。
【讨论】:
你也可以这样做:
Route::get('books/{name}', function($name){
$url = explode("-", $name);
$id = $url[0];
return "Book #$id";
});
因此,如果您传递如下网址,则可以通过 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 属性应该是唯一的。
【讨论】: