路由按声明的顺序进行匹配
这是 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
。