Robo Robok
Robo Robok

Reputation: 22673

API exceptions in Laravel 5

I'd like to catch all ordinary exceptions (instances of Exception class) from one of my controllers (or in future in several controllers) to unify their behavior. I know how to make global handlers for exceptions in Exceptions/Handler.php, but how can I limit them to some particular controller?

What I want to do is to return such an array in JSON format whenever Exception is being thrown in my API controller:

[
    'error' => 'Internal error occurred.'
]

I could decide to throw my own exception class, perhaps ApiException, but I want to serve third party exceptions as well, such as database errors.

Should I pass some value to the request object directly? If so, how? Or maybe there's another way?

Upvotes: 5

Views: 5239

Answers (3)

tzi
tzi

Reputation: 9459

You can also filter by the request by their path patterns.

Go to the file app\Exceptions\Handler.php:

public function render($request, \Exception $e)
{
    /* Filter the requests made on the API path */
    if ($request->is('api/*')) {
        return response()->json(["error" => "An internal error occurred"]);
    }

    return parent::render($request, $e);
}

Upvotes: 2

Needpoule
Needpoule

Reputation: 4576

If you want to render a different type of exception for a specific controller, you can use the request object to check the current controller :

Exceptions/Handler.php

public function render($request, Exception $e)
{
    if($request->route()->getAction()["controller"] == "App\Http\Controllers\ApiController@index"){
        return response()->json(["error" => "An internal error occured"]);
    }
    return parent::render($request, $e);
}

Upvotes: 3

astroanu
astroanu

Reputation: 3973

You can do this:

create an exception class

class APIException extends Exception{

}

then throw it from the controller

throw new APIException('api exception');

and catch it from Exceptions/Handler.php

public function render($request, Exception $e)
{
    if ($e instanceof APIException){
        return response(['success' => false, 'data' => [], 'message' => $e->getMessage(), 401);
    }
    if ($e instanceof SomeException){
        return response(['success' => false, 'data' => [], 'message' => 'Exception'], 401);
    }

    return parent::render($request, $e);
}

Upvotes: 2

Related Questions