Laravel控制器show方法校验记录存在并调用自定义404方法报错如何解决
错误原因
- 你使用了Laravel隐式路由模型绑定:当请求的字体ID不存在时,Laravel会直接抛出
ModelNotFoundException返回404,不会进入你控制器show方法的校验逻辑。 exists是Eloquent模型实例的属性而非方法,你调用$font->exists()会直接报方法不存在的错误,这是你当前报错的直接诱因。
两种可行实现方案
方案一:手动查询模型(适配你原有的代码逻辑)
直接取消路由模型绑定,手动查询记录做判断:
// FontController 调整后的show方法 public function show($font_id) { $font = Font::find($font_id); // 为空或者不存在就返回404 if (empty($font) || !$font->exists) { return $this->display_not_found(); } if ($font->user_id !== auth()->user()->id) { return response(['message' => 'Forbidden'], 403); } return new FontResource($font); }
方案二:自定义路由模型绑定逻辑(符合Laravel开发规范)
如果要保留路由模型绑定的写法,可以自定义路由绑定的处理逻辑,直接在查询不到的时候返回你定义的404响应:
- 打开
app/Providers/RouteServiceProvider.php,在boot方法中添加如下代码:
Route::bind('font', function ($value) { $font = Font::find($value); if (empty($font)) { response(['message' => 'Not found'], 404)->send(); exit; } return $font; });
- 调整后的控制器
show方法可以省去存在性判断:
public function show(Font $font) { if ($font->user_id !== auth()->user()->id) { return response(['message' => 'Forbidden'], 403); } return new FontResource($font); }
内容的提问来源于stack exchange,提问作者Công Nguyễn
相关产品推荐
相关产品推荐

