Laravel 9 更新分类报错:PUT方法不支持 仅支持GET、HEAD
问题根因
报错核心原因是路由配置绑定错误,和请求方法是POST还是PUT没有直接关系:
- 你定义的更新分类路由
/admin/category/update/{id},POST请求指向的是控制器的edit方法,而edit方法是仅支持GET请求、用来返回编辑表单页的方法,根本不处理提交的更新逻辑 - 控制器方法参数定义冗余,同时使用路由模型绑定和手动传$id,会导致参数解析异常
- 之前修改路由/请求方法后未清除路由缓存,旧配置仍在生效
修复步骤
- 修正路由配置,将更新路由绑定的控制器方法从
edit改为update,匹配你当前表单用POST提交的写法:
// Admin category routes Route::get('/admin/category', [AdminCategoryController::class,'index'] )->name('admin_category'); Route::get('/admin/category/create', [AdminCategoryController::class,'create'] )->name('admin_category_create'); Route::post('/admin/category/store', [AdminCategoryController::class,'store'] )->name('admin_category_store'); Route::get('/admin/category/edit/{id}', [AdminCategoryController::class,'edit'] )->name('admin_category_edit'); // 修正此处绑定的方法为update Route::post('/admin/category/update/{id}', [AdminCategoryController::class,'update'] )->name('admin_category_update');
- 修正控制器中edit、update方法的参数定义,去掉冗余的模型注入参数,同时将
find()改为findOrFail(),避免查询不到数据时报非对象错误:
// 修正edit方法 public function edit($id) { $data = Category::findOrFail($id); return view('admin.category.edit', [ 'data' => $data ]); } // 修正update方法 public function update(Request $request, $id) { $data = Category::findOrFail($id); $data->parent_id = 1; $data->title = $request->title; $data->keywords = $request->keywords; $data->description = $request->description; $data->status = $request->status; $data->save(); return redirect()->route('admin_category'); }
- 执行Artisan命令清除缓存,让新配置生效:
php artisan route:clear php artisan config:clear
- (可选优化)将表单action改为通过路由名生成,避免硬编码路径后续修改麻烦,替换edit.blade.php中form标签的action属性:
<form action="{{ route('admin_category_update', $data->id) }}" method="POST"> @csrf <!-- 其余表单内容保持不变 -->
如果后续要遵循RESTful规范改用PUT请求,只需要在表单内添加
@method('PUT'),同时将更新路由的Route::post改为Route::put即可。
内容的提问来源于stack exchange,提问作者ademclk
相关产品推荐
相关产品推荐

