2015-04-27 21 views
5

Vorrei raccogliere tutte le eccezioni ordinarie (istanze della classe Exception) da uno dei miei controller (o in futuro in più controller) per unificare il loro comportamento. So come creare gestori globali per le eccezioni in Exceptions/Handler.php, ma come posso limitarli ad un controller particolare?Eccezioni API in Laravel 5

Quello che voglio fare è quello di restituire una tale varietà in formato JSON ogni volta Eccezione viene gettata nel mio controller API:

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

potrei decidere di gettare la mia classe di eccezione, forse ApiException, ma io vuoi servire anche eccezioni di terze parti, come errori di database.

Devo passare qualche valore all'oggetto richiesta direttamente? Se é cosi, come? O forse c'è un altro modo?

risposta

3

Se si vuole rendere un diverso tipo di eccezione per un controller specifico, è possibile utilizzare l'oggetto di richiesta di verificare il controllo di corrente:

Eccezioni/Handler.php

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

Grazie! '$ request-> route()' è la cosa, ma l'ho risolto usando 'if ($ request-> ajax())', è più facile per il debug. :) –

1

Si può fare questo:

creare una classe di eccezione

class APIException extends Exception{ 

} 

poi gettarlo dal controller

throw new APIException('api exception'); 

e prendere da Eccezioni/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); 
} 
+0

Si prega di leggere gli ultimi due paragrafi della mia domanda. –

2

È inoltre possibile filtrare dalla richiesta in base al loro percorso.

Vai alla scheda 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 occured"]); 
    } 

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