phpjsonrestlaravel-4restful-architecture

How can I make Laravel return a custom error for a JSON REST API


I'm developing some kind of RESTful API. When some error occurs, I throw an App::abort($code, $message) error.

The problem is: I want him to throw a json formed array with keys "code" and "message", each one containing the above mentioned data.

Array
(
    [code] => 401
    [message] => "Invalid User"
)

Does any one knows if it's possible, and if it is, how I do it?


Solution

  • go to your app/start/global.php.

    This will convert all errors for 401 and 404 to a custom json error instead of the Whoops stacktrace. Add this:

    App::error(function(Exception $exception, $code)
    {
        Log::error($exception);
    
        $message = $exception->getMessage();
    
        // switch statements provided in case you need to add
        // additional logic for specific error code.
        switch ($code) {
            case 401:
                return Response::json(array(
                        'code'      =>  401,
                        'message'   =>  $message
                    ), 401);
            case 404:
                $message            = (!$message ? $message = 'the requested resource was not found' : $message);
                return Response::json(array(
                        'code'      =>  404,
                        'message'   =>  $message
                    ), 404);        
        }
    
    });
    

    This is one of many options to handle this errors.


    Making an API it is best to create your own helper like Responser::error(400, 'damn') that extends the Response class.

    Somewhat like:

    public static function error($code = 400, $message = null)
    {
        // check if $message is object and transforms it into an array
        if (is_object($message)) { $message = $message->toArray(); }
    
        switch ($code) {
            default:
                $code_message = 'error_occured';
                break;
        }
    
        $data = array(
                'code'      => $code,
                'message'   => $code_message,
                'data'      => $message
            );
    
        // return an error
        return Response::json($data, $code);
    }