首页 > 解决方案 > Laravel 5.7 ModelNotFoundException 不为 API 调用返回 json

问题描述

当找不到模型时,当对 laravel 5.7 应用程序 api 路由进行 api 调用时,我想返回一个 json 响应。为此,我修改了这样的render()方法app\Exceptions\Handler.php

public function render($request, Exception $exception)
    {
        if ($exception instanceof ModelNotFoundException && $request->wantsJson()) {
            return response()->json(['message' => 'Not Found!'], 404);
        }

        return parent::render($request, $exception);
    }

我的控制器show()方法正在使用这样的Book模型

public function show(Book $book)
    {
        return new BookResource($book->load('ratings'));
    }

localhost:8000/api/books/1在邮递员上进行测试,对(id 1 已被删除)的 get 调用不断返回默认的 laravel 404 not found 页面而不是 json。

我错过了一步吗?我还注意到,show()像这样在控制器方法中添加条件语句

public function show(Book $book)
    {
        if ($book) {
            return new BookResource($book->load('ratings'));
        } else {
            return response()->json(['message' => 'Not found'], 404);
        }
    }

返回相同的 html 结果而不是 json。

处理这种情况的正确方法是什么?

标签: phplaravel

解决方案


你的代码是正确的。问题是您可能正在本地环境中对其进行测试,因此在您的 .env 中您已设置:

APP_DEBUG=true,将其切换到APP_DEBUG=false,您将看到您的自定义消息。

PS:$request->wantsJson() 如果您的客户发送正确的标头信息,则不需要,例如:'accept:application/json'


推荐阅读