Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom findOrFail for the API routes

I think this should be implemented by default since I'm working in routes/api.php.

I want to give a 404 error JSON response in case that we don't find any rows for the given id argument on findOrFail() method.

Something like:

return response()->json([
    'status' => 'ERROR',
    'error' => '404 not found'
], 404);

Instead of the default Sorry, the page you are looking for could not be found. blade page.

I don't want to do:

$item = Model::find($id);
if (is_null($item)) {
    return response()->json([
        'status' => 'ERROR',
        'error' => '404 not found'
    ], 404);
}

Everywhere when I getting an id, and I wouldn't like to implement this in a middleware since it will cause some 'mess' on the api.php file.

like image 577
Hula Hula Avatar asked Dec 07 '22 16:12

Hula Hula


2 Answers

You can always catch the exception in the App\Exceptions\Handler.php

Import the exception into the class using the following:

use \Illuminate\Database\Eloquent\ModelNotFoundException;

and in the render method, add

if ($e instanceof ModelNotFoundException) {

            return response()->json([
                'message' => 'Record not found',
            ], 404);

        }
like image 156
pseudoanime Avatar answered Dec 10 '22 22:12

pseudoanime


Just to add, I ended up checking for these three exceptions:

  1. Illuminate\Database\Eloquent\ModelNotFoundException;
  2. Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
  3. Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

And then returning JSON if expected:

if ($request->expectsJson()) {
    return response()->json(['error' => $msg], $code);    
}
like image 38
Robert Brisita Avatar answered Dec 10 '22 21:12

Robert Brisita