发生 ModelNotFoundException 时,我想返回一个JSON响应而不是默认的404错误页面。为此,我将以下代码写入app\Exceptions\Handler.php
:
public function render($request, Exception $exception)
{
if ($exception instanceof ModelNotFoundException) {
return response()->json([
'error' => 'Resource not found'
], 404);
}
return parent::render($request, $exception);
}
但是它不起作用。当发生 ModelNotFoundException 时,Laravel仅显示空白页。我发现,即使在Handler.php
中声明一个空的渲染函数,Laravel也会在 ModelNotFoundException 上显示空白页。
如何解决此问题,使其可以返回JSON /执行覆盖的渲染函数中的逻辑?
答案 0 :(得分:5)
在Laravel 8x中,您需要使用Rendering Exceptions
方法的register()
use App\Exceptions\CustomException;
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->renderable(function (CustomException $e, $request) {
return response()->view('errors.custom', [], 500);
});
}
对于ModelNotFoundException
,您可以执行以下操作。
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
public function register()
{
$this->renderable(function (NotFoundHttpException $e, $request) {
return response()->json(...);
});
}
默认情况下,Laravel异常处理程序将为您将异常转换为HTTP响应。但是,对于给定类型的异常,您可以自由注册自定义渲染闭包。您可以通过异常处理程序的renderable
方法来完成此操作。 Laravel将通过检查闭包的类型提示来推断闭包呈现的异常类型:
答案 1 :(得分:0)
这是我的处理程序文件:
use Throwable;
public function render($request, Throwable $exception)
{
if( $request->is('api/*')){
if ($exception instanceof ModelNotFoundException) {
$model = strtolower(class_basename($exception->getModel()));
return response()->json([
'error' => 'Model not found'
], 404);
}
if ($exception instanceof NotFoundHttpException) {
return response()->json([
'error' => 'Resource not found'
], 404);
}
}
}
此仅适用于API路由中的所有请求。如果要捕获所有请求,请删除第一个条件。