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

时间:2015-01-08 08:54:26

标签: laravel routes

我在laravel 4中定义了一条看起来如此的路线:

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

在网址中显示/ books / 1例如,现在我问的是有没有办法显示图书的名称而是要将id作为参数保留在路径中以供搜索引擎优化目的

提前致谢

3 个答案:

答案 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

,则可以按ID获取图书

答案 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
不客气。