Laravel更新操作报错:PUT/PATCH方法不支持对应路由,请求排查
解决Laravel中PUT/PATCH方法不支持的路由问题
看起来你在Laravel的文章更新功能里碰到了两个头疼的路由报错,我帮你拆解下问题根源,一步步解决:
核心问题:路由参数多写了多余的$符号
你先后遇到的PUT方法不支持、PATCH方法不支持报错,本质是路由定义出了关键错误。看你的路由代码:
Route::put('/articles/{$article}', 'ArticlesController@update');
这里的{$article}是错误写法!Laravel的路由参数不需要加$符号,正确格式应该是{article}。这个小失误会导致路由完全无法匹配你的请求,框架自然就返回“方法不支持”的报错了。
一步步修复方案
1. 先修正路由定义
把路由改成正确的参数格式:
Route::put('/articles/{article}', 'ArticlesController@update');
2. 优化控制器方法(可选但更规范)
你的控制器现在是通过$id手动查找模型,其实Laravel有更便捷的路由模型绑定,直接注入Article实例,既简洁又能自动处理模型不存在的情况:
public function update(Article $article){ $article->title = request('title'); $article->excerpt = request('excerpt'); $article->body = request('body'); $article->save(); return redirect('/articles/'. $article->id); }
这样写的话,Laravel会自动根据路由里的{article}参数找到对应的文章,不用再手动find($id),如果找不到还会自动返回404页面,比原来的写法更健壮。
要是你想继续用原来的$id写法也没问题,只要路由参数修正后,控制器里的$id能正常接收参数就行,不过记得加个判断防止find($id)返回null:
public function update($id){ $article = Article::find($id); // 防止找不到文章的情况 if (!$article) { abort(404); } $article->title = request('title'); $article->excerpt = request('excerpt'); $article->body = request('body'); $article->save(); return redirect('/articles/'. $article->id); }
3. 确认表单代码没问题
你的Blade表单写法是正确的:
<form method="POST" action="/articles/{{$article->id}}" > @csrf @method('PUT') <!-- 这里放你的表单输入字段 --> </form>
@method('PUT')会生成一个隐藏字段,把POST请求转换成PUT请求,和你修正后的路由方法是匹配的。
额外排查小技巧
如果修复后还是有问题,试试这两步:
- 清除路由缓存:在终端运行
php artisan route:clear,确保新的路由配置生效; - 检查路由冲突:看看有没有其他路由(比如GET路由)用了相同的
/articles/{article}路径,导致请求被错误匹配。
内容的提问来源于stack exchange,提问作者dzstr
相关产品推荐
相关产品推荐

