资源控制器不会自动注册路由,必须显式调用route::resource()或route::apiresource()才能生成7个标准路由;默认映射index、create、store、show、edit、update、destroy方法,参数名需与路由一致(如{post}对应post $post),web路由启用csrf保护,api路由返回json且无重定向。

资源控制器怎么注册路由
资源控制器本身不自动注册路由,必须显式调用 Route::resource() 或 Route::apiResource() 才会生成 7 个标准路由。漏掉这一步,控制器方法写得再全也 404。
常见错误是只运行 php artisan make:controller PostController --resource,就以为路由已就位——其实只是生成了空控制器文件,没动路由表。
-
Route::resource('posts', PostController::class)生成面向 Web 的资源路由(含_token验证、重定向等) -
Route::apiResource('posts', PostController::class)生成无 CSRF、返回 JSON、无重定向的 API 路由 - 路径前缀、中间件、命名空间等需额外传参,比如加中间件要写成
->middleware('auth')
哪些路由方法会被自动映射
默认 7 个方法名是硬编码的:index、create、store、show、edit、update、destroy。Laravel 不查方法是否存在,只按约定名绑定 HTTP 动词 + URI;哪怕你删了 create 方法,GET /posts/create 仍会尝试调用它并抛出 MethodNotAllowedHttpException。
-
index→ GET /posts -
store→ POST /posts(注意不是 PUT) -
update→ PUT/PATCH /posts/{post} -
destroy→ DELETE /posts/{post} - 如果只想要部分动作,用
only或except:例如->only(['index', 'show'])
为什么 POST 表单提交后跳转失败或报 419
Web 资源路由默认启用 CSRF 保护,store 和 update 必须携带有效 _token。API 资源路由则完全跳过 CSRF,但也不会自动设置 Content-Type: application/json 或返回重定向响应。
- Web 场景下,Blade 表单里漏写
@csrf就会触发 419 页面过期错误 - 用 Postman 测试 Web 路由时,手动加
X-CSRF-TOKEN头不如直接用GET /login拿 token 更可靠 - 前后端分离项目别混用
Route::resource,该用apiResource就用,否则redirect()返回 HTML 会卡住前端 fetch
参数名和模型绑定怎么对上号
资源路由的参数名默认取自单数形式的资源名,比如 posts 对应 {post},而不是 {id}。如果你在 show(Post $post) 方法里用了 Laravel 的隐式模型绑定,这个变量名必须和路由参数名一致,否则绑定失败,$post 是 null。
- 自定义参数名要用
parameters:例如->parameters(['posts' => 'article']),之后路由变成/posts/{article},控制器方法就得写成show(Article $article) - 参数名大小写敏感,
{Post}和{post}是两个不同参数 - 模型绑定只发生在类型提示为 Eloquent 模型时,
show($post)不会自动查库
最常被忽略的是控制器方法签名和路由参数名的咬合关系——改了路由参数却不改方法参数名,或者启用了模型绑定却忘了加类型提示,结果数据始终拿不到。











