Laravel 8调用update方法报错BadMethodCallException提示show方法不存在
问题根源
- 你注册了
Route::resource('users', UsersGestionController::class)资源路由,Laravel的资源路由会默认注册包含show、update在内的7个标准RESTful方法路由,你没有定义show方法所以触发对应异常。 - 你前端用
<a>标签调用route('users.update',$users->id),<a>标签发起的是GET请求,而资源路由的update方法默认匹配PUT/PATCH请求,GET /users/{用户ID}的请求会直接匹配到资源路由的show方法规则,所以不会走到你预期的update逻辑,反而触发了show方法不存在的报错。 - 代码存在多处语法、命名不匹配问题:
- 控制器中
User:where少写一个冒号,正确写法为User::where - 控制器名拼写不一致:你的控制器文件名为
UserGestionController.php,但路由中写的是UsersGestionController(多了一个s) - 路由重复定义:你先后定义了两个
/userslist路由,前者闭包路由会被后者覆盖 - 跳转路由名不匹配:
update方法中redirect()->route('userlist'),但你定义的路由名是userslist(多了一个s)
- 控制器中
修复步骤
- 调整资源路由规则:如果你不需要完整的7个资源方法,要么限制资源路由只注册你需要的方法,要么直接删除资源路由(你已经单独定义了update自定义路由):
// 方式1:限制资源路由仅注册需要的方法 Route::resource('users', UsersGestionController::class)->only(['update']); // 方式2:不需要就直接删除这行资源路由代码 - 修改前端更新提交逻辑:不能用a标签发起更新请求,改为表单提交,匹配路由请求规则:
如果你用资源路由的update方法:
如果你用自己定义的POST类型update路由:<form action="{{ route('users.update', $users->id) }}" method="POST"> @csrf @method('PUT') <!-- 你的用户信息表单字段 --> <button type="submit" class="btn btn-warning">更新</button> </form><form action="{{ route('update') }}" method="POST"> @csrf <input type="hidden" name="id" value="{{ $users->id }}"> <!-- 其他用户信息表单字段 --> <button type="submit" class="btn btn-warning">更新</button> </form> - 修复所有语法和命名不匹配问题:
- 修正控制器中的
User:where为User::where - 统一控制器名拼写,要么都加s要么都不加
- 删除顶部无效的闭包
/userslist路由 - 修正update方法中的跳转路由为
route('userslist')
- 修正控制器中的
内容的提问来源于stack exchange,提问作者SouhailMT
相关产品推荐
相关产品推荐

