2015-10-30 6 views
7

Sto lavorando su un'applicazione RESTful che utilizza Laravel 5 e sto cercando di rilevare le eccezioni e generare una risposta appropriata. Sto anche utilizzando il pacchetto tymondesigns/jwt-auth in modo che tutte le risposte API siano in formato JSON JSend.Come catturare le eccezioni globali in laravel 5 generate dal pacchetto tymondesigns/jwt-auth?

In questo momento sto cercando di catturare lo TokenExpiredException che si verifica quando il token specificato è scaduto, naturalmente. Così ho provato questo nel Handler.php:

if($e instanceof TokenExpiredException) 
{ 
    return jsend()->error() 
      ->message("Token Expired") 
      ->code(403) 
      ->data([null]) 
      ->get(); 
} 

Ma io non sono ancora in grado di intercettare questa eccezione e restituire una risposta JSON. Anche se sono in grado di fare questo per le altre eccezioni come:

if ($e instanceof ModelNotFoundException) { 
    $e = new NotFoundHttpException($e->getMessage(), $e); 

    return jsend()->error() 
       ->message("404 Model Not Found") 
       ->data([null]) 
       ->get(); 
} 

E:

if ($this->isHttpException($e)) 
{  
    if($e instanceof NotFoundHttpException) 
    { 
     return jsend()->error() 
       ->message("404 Route Not Found") 
       ->data([null]) 
       ->get(); 
    } 
    return $this->renderHttpException($e); 
} 

Come gestire altre eccezioni in laravel?

risposta

4

Sembra ho dimenticato di utilizzare lo spazio dei nomi:

if($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException) 
{ 
    return jsend()->error() 
      ->message("Token Expired") 
      ->code(403) 
      ->data([null]) 
      ->get(); 
} 

piccoli errori!

+0

Questo ancora lavorare con laravel 5.4? Perché l'ho impostato come sopra, ma non ha ancora catturato l'eccezione – gthuo

2

Se qualcuno viene a chiedersi qui con lo stesso problema per il nuovo Laravel (5.4) e jwt-auth (1.0. * @ Dev) ... ora c'è un'altra causa/soluzione a questo.

Il provider intercetta l'istanza di \Tymon\JWTAuth\Exceptions\TokenExpiredException e ripristina l'istanza di Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException. eccezione originale è ancora disponibile con il metodo getPrevious(), quindi la gestione degli errori sarebbe ora essere simile a questa:

public function render($request, Exception $exception) 
{   
    if ($exception->getPrevious() instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException) { 
     return response()->json(['error' => $exception->getPrevious()->getMessage()], $exception->getStatusCode()); 
    } else if ($exception->getPrevious() instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException) { 
     return response()->json(['error' => $exception->getPrevious()->getMessage()], $exception->getStatusCode()); 
    } 

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