Laravel 路由:定义包含斜杆(/)的路由参数 2 个改进

例如这样的一个 URL:

packagist.org/packages/laravel/sco...

我们想让 laravel/scout 这个 URI 分段为参数,可以这样做:

Route::get('packages/{slashName?}', 'PackagesController@show')
    ->where('slashName', '(.*)');

此时 PackagesControllershow 方法:

public function show($slashName, Request $request)
{
    dd($slashName);
}

会输出:

“laravel/scout”

路由参数

必填参数

单个参数

有时候您需要在路由中捕获一些 URL 片段。例如,从 URL 中捕获用户的 信息,那就这样来定义路由参数:

routes/web.php

Route::get('users/{user}', 'UsersController@show')->name('users.show');

例如这样的一个 URL:

www.example.com/users/1

此时 UsersControllershow 方法:

app/Http/Controllers/UsersController.php

public function show( User $user )
{
    return $user;
}

会输出:

{"id":1,"name":"Laravel","email":"laravel@example.com","email_verified_at":null,"created_at":"2021-02-10 21:27:51","updated_at":"2021-02-10 21:27:51"}

如果想要具体数据可以使用对象(->)方式来获取

return $user->name;

会输出:

Laravel

多个参数

也可以根据您的需要在路由中定义多个参数:

routes/web.php

Route::get('posts/{post}/comments/{comment}', function ( $post, $comment ) {
    dd("Post: $post", "Comment: $comment");
});

例如这样的一个 URL:

www.example.com/posts/xiaoming/com...

会输出:

Post: xiaoming
Comment: example

可选参数

有时,你可能需要指定一个路由参数,但你希望这个参数是可选的。你可以在参数后面加上 ? 标记来实现,但前提是要确保路由的相应变量有默认值:

routes/web.php

Route::get('user/{name?}', function ($name = 'xiaoming') {
     dd($name);
});

例如这样的一个 URL:

www.example.com/user

会输出

xiaoming

例如这样的一个 URL:

www.example.com/John

会输出

John

注意:路由的参数通常都会被放在 {} 内,并且参数名只能为字母,而不能包含 - 符号。如果有需要,可以用下划线 _ 代替 - 。路由参数会按路由定义的顺序依次注入到路由回调或者控制器中,而不受回调或者控制器的参数名称的影响。

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 2
华贤

问题解决了,谢谢大佬分享

4年前 评论
elesos

厉害

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!