Php Laravel 5.7 ModelNotFoundException不为API调用返回json
我想在没有找到模型的情况下,对laravel 5.7应用程序api路由进行api调用时返回json响应。为此,我修改了Php Laravel 5.7 ModelNotFoundException不为API调用返回json,php,laravel,Php,Laravel,我想在没有找到模型的情况下,对laravel 5.7应用程序api路由进行api调用时返回json响应。为此,我修改了app\Exceptions\Handler.php的render()方法,如下所示 public function render($request, Exception $exception) { if ($exception instanceof ModelNotFoundException && $request->wantsJ
app\Exceptions\Handler.php的render()
方法,如下所示
public function render($request, Exception $exception)
{
if ($exception instanceof ModelNotFoundException && $request->wantsJson()) {
return response()->json(['message' => 'Not Found!'], 404);
}
return parent::render($request, $exception);
}
public function show(Book $book)
{
return new BookResource($book->load('ratings'));
}
我的控制器show()
方法使用的是这样一种Book
模型
public function render($request, Exception $exception)
{
if ($exception instanceof ModelNotFoundException && $request->wantsJson()) {
return response()->json(['message' => 'Not Found!'], 404);
}
return parent::render($request, $exception);
}
public function show(Book $book)
{
return new BookResource($book->load('ratings'));
}
在postman上测试,对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
处理这种情况的正确方法是什么?您可以删除$request->wantsJson
或者,您可以在请求中设置标题“Accept”=>“application/json”
这可以帮助您:
public function render($request, Exception $exception)
{
if ($exception instanceof ModelNotFoundException && ($request->wantsJson() || $request->ajax())) {
return response()->json(['message' => 'Not Found!'], 404);
}
return parent::render($request, $exception);
}
你的代码是正确的。问题是您可能正在本地环境中测试它,因此在.env中设置了:
APP_DEBUG=true
,将其切换到APP_DEBUG=false
,您将看到自定义消息
PS:$request->wantsJson()
如果您的客户端发送了正确的头信息,则不必执行此操作,例如:'accept:application/json'
由于在注入模型之前发生了异常,因此不会触发条件语句。接下来的解决方案是什么?结果仍然相同您尝试了什么?请同时记录get_类($exception)。