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

Laravel 10中Missing方法失效?API路由404错误处理问题

解决Laravel API路由404返回Web页面而非自定义响应的问题

核心问题说明

你用的missing方法只针对路由模型绑定场景生效——也就是路由存在,但请求的模型ID不存在时触发(比如访问/api/survey/999,999是不存在的Survey ID)。如果是访问完全不存在的API路由(比如/api/invalid-path),这个方法不会起作用,Laravel会默认返回Web端的404页面。


分场景解决方案

场景1:路由存在但模型不存在(路由模型绑定的404)

  1. 确保控制器方法使用路由模型绑定注入:
// app/Http/Controllers/SurveyController.php
public function show(Survey $survey)
{
    // 若Survey模型不存在,会自动触发路由的missing回调
    return response()->json($survey);
}
  1. 调整路由的missing回调,返回标准API响应:
// routes/api.php
Route::apiResource('survey', SurveyController::class)
    ->missing(function (\Illuminate\Http\Request $request) {
        // 按需返回noContent或JSON提示
        return response()->noContent(404);
        // 可选:return response()->json(['msg' => '资源不存在'], 404);
    });

场景2:完全不存在的API路由(全局404处理)

要让所有不存在的API路由返回自定义响应,需要在异常处理器中配置:

Laravel 8-9版本(修改app/Exceptions/Handler.php)
public function render($request, Throwable $exception)
{
    // 判断是否为API路由且是404异常
    if ($request->is('api/*') && $exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
        return response()->noContent(404);
    }

    return parent::render($request, $exception);
}
Laravel 10+版本(修改app/Exceptions/Handler.php的register方法)
public function register()
{
    $this->renderable(function (\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e, $request) {
        if ($request->is('api/*')) {
            return response()->noContent(404);
        }
    });
}

额外注意事项

  • 所有API路由必须放在routes/api.php中,该文件的路由默认带有/api前缀(由RouteServiceProvider配置),测试时要访问正确的前缀路径,比如/api/survey而非/survey。
  • 如果你的API路由没有使用/api前缀,可改用$request->wantsJson()来精准判断是否为API请求。

内容的提问来源于stack exchange,提问作者Bernan Ribeiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:22:16