使用PUT方法时持续提示不被允许的问题排查
Laravel PUT方法更新产品提示「不被允许」的解决方案
核心问题及修复步骤
1. 表单提交路由错误
你的表单action指向了products.edit(GET请求的编辑页面路由),但PUT请求应该提交到products.update路由,这是导致「不被允许」提示的直接原因。
修改blade表单代码:
<form action="{{ route('products.update', $product->id) }}" method="post"> @method('PUT') @csrf <!-- 其他表单字段 --> </form>
2. 验证规则与请求字段不匹配
控制器中验证的字段是name、desc,但实际从请求中获取的是product_title、product_desc,字段不匹配会触发验证失败,间接引发权限类提示。
修改控制器的验证规则:
$validatedData = $request->validate([ 'product_title' => 'required', 'product_desc' => 'required', 'product_price' => 'required|numeric', 'product_qty' => 'required', ]);
3. DB::update参数缺失
你的SQL语句包含5个占位符(title、desc、price、qty、id),但绑定的参数数组只有4个值,缺少$id,数据库执行错误会间接触发权限类提示。
修改控制器的DB更新代码:
DB::update('update products set title = ?, desc = ?, price = ?, qty = ? where id = ?', [$newTitle, $newDesc, $newPrice, $newQty, $id]);
4. 清理重复的edit方法
控制器中重复定义了edit方法,会引发语法错误,建议删除其中一个:
// 保留一个edit方法即可 public function edit(Product $product) { return view('products_update', compact('product')); }
额外优化建议
- 利用Laravel模型绑定简化update方法,无需手动处理id:
对应的路由可简化为:public function update(Request $request, Product $product) { $validated = $request->validate([ 'product_title' => 'required', 'product_desc' => 'required', 'product_price' => 'required|numeric', 'product_qty' => 'required', ]); $product->update([ 'title' => $validated['product_title'], 'desc' => $validated['product_desc'], 'price' => $validated['product_price'], 'qty' => $validated['product_qty'], ]); return redirect()->route('products.index')->with('success', '产品更新成功。'); }Route::put('/products/{product}', [ProductController::class, 'update'])->name('products.update');
内容的提问来源于stack exchange,提问作者Fresh Grad CS
相关产品推荐
相关产品推荐

