You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel控制器show方法校验记录存在并调用自定义404方法报错如何解决

错误原因

  1. 你使用了Laravel隐式路由模型绑定:当请求的字体ID不存在时,Laravel会直接抛出ModelNotFoundException返回404,不会进入你控制器show方法的校验逻辑。
  2. 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响应:

  1. 打开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;
});
  1. 调整后的控制器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:18:03