php - 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。
处理这种情况的正确方法是什么?
解决方案
你的代码是正确的。问题是您可能正在本地环境中对其进行测试,因此在您的 .env 中您已设置:
APP_DEBUG=true
,将其切换到APP_DEBUG=false
,您将看到您的自定义消息。
PS:$request->wantsJson()
如果您的客户发送正确的标头信息,则不需要,例如:'accept:application/json'
推荐阅读
- javascript - 如何使用 Javascript 在 Razor 页面中运行后台程序
- sql - 未定义的函数:“格式”。该函数既不是注册的临时函数也不是数据库中注册的永久函数
- git - Visual Studio:将分支推送到远程存储库时遇到错误:无法拉取以集成更改:拉取命令已禁用
- sql-server - 使用 WHERE 子句排除数据,但仅在某些条件下
- bash - 如何防止Expect输出CRLF?
- xamarin - 如何将文件选择器打开按钮文本更改为在 xamarin 表单 UWP 中发送?
- c# - 如何使用名称等属性覆盖 WPF 中特定列的数据网格单元格?
- unit-testing - 如果 ArrayList 已经包含回调,如何测试是否未添加回调 - 单元测试
- python - 使用 pandas 从复杂的 xml 文档中提取文本元素
- shopify - Shopify - 将变量传递到 if 语句中?