Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel error handling, get_class vs instanceof

In the following code in app/Exceptions/Handler.php, the first one doesn't work but the second one does.

dd(get_class($exception)); outputs "Illuminate\Database\Eloquent\ModelNotFoundException".

The first one is similar to the doc. How can I make it work using instanceof?

    public function render($request, Exception $exception)
    {
        //dd(get_class($exception));
        // this does not work.
        if ($exception instanceof Illuminate\Database\Eloquent\ModelNotFoundException
) {
            return response()->json(['error'=>['message'=>'Resouce not found']], 404);
        }
        // This one works.
        if(get_class($exception) == "Illuminate\Database\Eloquent\ModelNotFoundException") {
            return response()->json(['error'=>['message'=>'Resouce not found']], 404);
        }

        return parent::render($request, $exception);
    }
like image 589
shin Avatar asked Jan 30 '23 02:01

shin


2 Answers

To use instanceof you must use the full class name, and if your class has a namespace then you should use the fully qualified class name of the class.

And there is an other way to use instanceof using a short name (alias) for a given class thanks to use statement, in your case you can use it like so :

use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException; // on top of course :) 

if ($exception instanceof ModelNotFoundException) {
        return response()->json(['error'=>['message'=>'Resouce not found']], 404);
}
like image 52
Maraboc Avatar answered Feb 05 '23 16:02

Maraboc


Sometimes an $exception is rethrown, so try to use

$exception->getPrevious() instanceof XXX

or

get_class($exception->getPrevious()) == 'XXX'
like image 29
ALeX inSide Avatar answered Feb 05 '23 16:02

ALeX inSide