路由按声明的顺序进行匹配

这是 Laravel 路线的常见问题。路由按声明的顺序进行匹配。第一个匹配的路由是使用的路由。

此示例将按预期工作:

Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Route::get('/posts/{postId}', 'PostController@show');

/posts/1/comments/1 的获取请求将调用 CommentController@show。对/posts/1 的获取请求将调用 PostController@show

但是,此示例不会以相同的方式工作:

Route::get('/posts/{postId}', 'PostController@show');
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');

/posts/1/comments/1 的获取请求将调用 PostController@show。对/posts/1 的获取请求将调用 PostController@show

因为 Laravel 使用第一个匹配的路由,所以/posts/1/comments/1 的请求匹配 Route::get('/posts/{postId}', 'PostController@show'); 并将变量 $postId 赋值给 1/comments/1。这意味着永远不会调用 CommentController@show