You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:50:27