phplaravellaravel-8

render function in Handler.php not working


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?


Solution

  • 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