
本文详解 Laravel 中出现 “The PUT method is not supported” 错误的根本原因,重点说明如何通过正确绑定路由参数、使用 @method('PUT') 和 route() 辅助函数,使表单成功触发 update 控制器方法。
本文详解 laravel 中出现 “the put method is not supported” 错误的根本原因,重点说明如何通过正确绑定路由参数、使用 `@method('put')` 辅助函数和命名路由,使表单成功触发 `update` 控制器方法。
在 Laravel 中,当你在表单中使用 @method('PUT') 声明请求方法时,框架会将该表单以 POST 方式提交,并通过 _method 隐藏字段模拟 PUT 请求——但前提是:对应路由必须真实存在且能匹配到带参数的 PUT 路由规则。你当前的错误提示 Supported methods: GET, HEAD 明确表明:Laravel 根本没找到匹配的 PUT 路由,而是命中了某个仅支持 GET/HEAD 的兜底路由(例如 GET /sections.update 字符串路径被当作普通 URI 解析)。
根本问题在于你的表单 action="sections.update" 是一个纯字符串路径,而非 Laravel 的命名路由调用。Laravel 不会自动将字符串 "sections.update" 解析为路由别名,更不会为其注入必需的路由参数(如 section ID)。因此,该请求最终被路由分发器视为访问 /sections.update 这一不存在的 GET 路径,自然只支持 GET/HEAD。
✅ 正确做法是:使用 route() 辅助函数生成完整 URL,并显式传入路由参数。假设你在 routes/web.php 中定义的是标准资源路由:
Route::resource('sections', SectionController::class);
它会自动生成类似 PUT /sections/{section} 的路由,其命名路由为 sections.update,且要求 section 参数(通常是模型主键或路由模型绑定所需值)。
因此,表单应改为:
⚠️ 注意事项:
- route('sections.update', [...]) 中的参数名 section 必须与路由定义中的占位符一致(如 sections/{section}),否则无法匹配;
- 若使用隐式模型绑定(推荐),控制器 update 方法签名应为 public function update(Request $request, Section $section),此时 $section 已自动查询并注入,无需手动 find($id);
- 表单中 是冗余的——路由参数已携带 ID,且模型绑定后 update() 直接作用于实例,无需额外 ID 字段;
- @csrf 与 @method('PUT') 缺一不可:前者提供 CSRF 保护,后者生成 以启用方法伪造。
最后检查路由是否注册并缓存:运行 php artisan route:list | grep sections.update 确认 PUT 方法及对应 URI 存在;若修改过路由,执行 php artisan route:clear 清除缓存。遵循以上规范,即可彻底解决 PUT 方法不被支持的问题。











