Laravel资源路由404主因是控制器方法名错误、HTTP方法不匹配、参数绑定失败或中间件顺序问题;应严格使用index/create/store/show/edit/update/destroy,配合only/except按需注册,并注意apiResource默认不含create/edit。

资源路由怎么声明才不会 404
Laravel 的 Route::resource() 默认只注册标准 CRUD 动作,但实际访问时 404,往往不是路由没写,而是控制器方法名或 HTTP 方法不匹配。
- 控制器必须继承
Controller,且方法名严格为index、create、store、show、edit、update、destroy—— 少一个或拼错(比如updata)就 404 - HTTP 方法必须对应:比如
store只响应POST,用GET访问/posts会进index,而不是store - 资源路由默认不包含
show的可选参数,如果 URL 是/posts/{id}/edit,必须确保{id}实际存在,否则模型绑定失败也会 404(不是路由层,是中间件层)
什么时候该用 only 或 except
资源路由全量注册 7 个动作,但多数接口不需要全部暴露,比如后台管理可能不需要 create 和 edit(前端用弹窗表单),API 接口可能只要 index 和 show。
-
Route::resource('posts', PostController::class)->only(['index', 'show'])—— 只注册这两个动作的路由 -
->except(['create', 'edit'])更适合“默认全开,个别禁用”的场景,比如 CMS 后台想屏蔽用户直接访问表单页 - 注意:
only/except不影响控制器方法是否存在,只是不注册对应路由;方法仍需保留,否则store被except后,控制器里删掉它,其他地方调用会报Method not found
Route::apiResource() 和普通 resource() 的关键区别
API 资源路由不是“更高级的资源路由”,它只是默认去掉 create 和 edit 这两个返回 HTML 表单的 GET 动作,其余行为完全一致。
-
Route::apiResource('posts', PostController::class)→ 注册index、store、show、update、destroy(5 个) - 它不会自动加 JSON 响应头、不会禁用 CSRF、也不会改变中间件 —— 这些得自己配
middleware('api') - 如果你的 API 需要
create(比如返回初始化字段),不能依赖apiResource,得回退到resource+only
自定义资源路由动作和参数名
标准资源路由路径是 /posts/{post},但有时需要改成 /posts/{post_slug},或者加额外动作如 publish。
- 改参数名:
Route::resource('posts', PostController::class)->parameters(['posts' => 'post_slug']),同时控制器方法签名要同步改为public function show($post_slug) - 加额外动作:
Route::resource('posts', PostController::class)->only(['index', 'show'])->scoped()->add(['publish' => 'posts.publish']),然后手动定义Route::post('/posts/{post}/publish', [PostController::class, 'publish']) - 注意:自定义动作不会自动加中间件,也不会参与资源命名规范(
route:list里显示为posts.publish,而非posts.publish.index)
资源路由的坑不在语法,而在隐式约定:控制器方法名、参数绑定、HTTP 方法、中间件顺序,四者缺一不可。少盯一个,请求就静默失败。











