路由按宣告的順序進行匹配
這是 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
。