Handler.php中的渲染功能无法正常工作Laravel 8

时间:2020-10-07 13:52:29

标签: php laravel laravel-8

发生 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 /执行覆盖的渲染函数中的逻辑?

2 个答案:

答案 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将通过检查闭包的类型提示来推断闭包呈现的异常类型:

有关error exception

的更多信息

答案 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路由中的所有请求。如果要捕获所有请求,请删除第一个条件。