render function in Handler.php not working Laravel 8

假如想象 提交于 2021-01-27 05:25:21

问题


I want to return a JSON response instead of the default 404 error page when ModelNotFoundException occurs. To do this, I wrote the following code into 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);
}

However it doesn't work. When the ModelNotFoundException occurs, Laravel just shows a blank page. I find out that even declaring an empty render function in Handler.php makes Laravel display a blank page on ModelNotFoundException.

How can I fix this so it can return JSON/execute the logic inside the overriden render function?


回答1:


In Laravel 8x, You need to Rendering Exceptions in register() method

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);
    });
}

For ModelNotFoundException you can do it as below.

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

public function register()
{
    $this->renderable(function (NotFoundHttpException $e, $request) {
        return response()->json(...);
    });
}

By default, the Laravel exception handler will convert exceptions into an HTTP response for you. However, you are free to register a custom rendering Closure for exceptions of a given type. You may accomplish this via the renderable method of your exception handler. Laravel will deduce what type of exception the Closure renders by examining the type-hint of the Closure:

More info about the error exception




回答2:


This one is my Handler file:

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);
                
            }
}
}

This one is only for all request in API route. If you want to catch all request, so remove the first if.



来源:https://stackoverflow.com/questions/64245534/render-function-in-handler-php-not-working-laravel-8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!