
本文详解 laravel 路由方法不匹配导致的“put method is not supported”错误,重点说明如何正确配置资源路由、表单 action 和 @method 指令,确保更新请求准确命中控制器 update 方法。
本文详解 laravel 路由方法不匹配导致的“put method is not supported”错误,重点说明如何正确配置资源路由、表单 action 和 @method 指令,确保更新请求准确命中控制器 update 方法。
在 Laravel 中,当你尝试更新资源(如分类 Category)却收到如下错误:
The PUT method is not supported for this route. Supported methods: GET, HEAD, POST
这通常意味着表单提交的 HTTP 方法(PUT)未被目标路由所接受——根本原因在于 表单的 action URL 指向了错误的路由,而非 Laravel 资源路由中为 update 动作预定义的、带参数的 PUT 路由。
? 错误根源分析
你当前的 Blade 表单写法为:
该写法存在两个关键问题:
-
硬编码路径
/kategori不带 ID:Laravel 的资源路由kategori.update对应的是类似/kategori/{kategori}的动态 URL,需显式传入模型 ID; -
未使用命名路由:直接写
/kategori会匹配到POST /kategori(即 store 方法),而非PUT /kategori/{id}(update 方法),因此 Laravel 报出“PUT not supported”。
查看你的路由截图(php artisan route:list 输出)可知,kategori.update 路由已正确定义,但表单未指向它。
✅ 正确解决方案
将表单 action 改为使用 Laravel 命名路由,并传入当前分类的 ID:
✅ 关键点:
route('kategori.update', $kategori->id)会生成形如/kategori/5的 URL;@method('PUT')+@csrf组合确保浏览器以 POST 方式发送请求,但 Laravel 中间件将其识别为 PUT(符合资源约定);- 使用
old()辅助函数可保留验证失败后的用户输入,提升体验。
? 额外建议与注意事项
-
确认路由定义:确保
routes/web.php中注册的是标准资源路由:Route::resource('kategori', CategoryController::class);这会自动生成包含
update的 PUT 路由(PUT /kategori/{kategori})。 -
控制器方法签名需匹配:
CategoryController@update应接收Category $kategori或int $id参数:public function update(Request $request, Category $kategori) { $kategori->update($request->validate([ 'judul' => 'required|string|max:255', 'isi' => 'required|string', ])); return redirect()->route('kategori.index')->with('success', 'Kategori berhasil diperbarui.'); } 避免 ID 传递遗漏:确保传递给视图的
$kategori是有效模型实例(非空),否则route()会抛出InvalidArgumentException。调试技巧:运行
php artisan route:list | grep kategori快速核对kategori.update的 URI 和方法是否正确。
通过以上调整,你的分类编辑功能即可正常工作——既符合 Laravel 资源路由规范,又规避了手动拼接 URL 带来的易错性。











