Laravel 9中/posts/drafts路由始终找不到的问题及解决
问题原因
Laravel 的 Route::resource('/posts', ...) 会自动生成一套 RESTful 路由,其中包含一条 GET /posts/{post} 的路由(对应控制器的 show 方法)。这条路由的匹配逻辑是:/posts/ 后面的任意字符串都会被当作 {post} 的参数值。
当你把自定义的 Route::get('/posts/drafts', ...) 放在 Route::resource 之后时,请求 /posts/drafts 会被先匹配到 GET /posts/{post} 路由,Laravel 会尝试查找 ID 为 drafts 的 Post 模型,自然找不到,最终返回「路由未找到」的错误。
而 /posts/{id}/reject 和 /posts/{id}/publish 没有问题,是因为它们的 URL 结构是 /posts/{id}/xxx,和 Route::resource 生成的路由结构无重叠,不会被提前拦截匹配。
解决方法
将自定义的 /posts/drafts 路由放到 Route::resource 前面,让 Laravel 优先匹配你的自定义路由:
Route::get('/posts/drafts', [PostController::class, 'draft'])->middleware('auth'); Route::resource('/posts', PostController::class)->middleware('auth'); Route::put('/posts/{id}/reject', [PostController::class, 'reject'])->middleware('auth'); Route::put('/posts/{id}/publish', [PostController::class, 'publish'])->middleware('auth');
验证方式
运行 php artisan route:list 命令查看完整路由列表,就能看到路由的匹配顺序。调整前 /posts/drafts 会排在 /posts/{post} 之后,调整后则会被优先展示和匹配。
内容的提问来源于stack exchange,提问作者Muhammad Hakim
相关产品推荐
相关产品推荐

