2015-10-30 13 views
7

Pracuję nad aplikacją RESTful przy użyciu Laravel 5 i próbuję wychwycić wyjątki i wygenerować odpowiednią odpowiedź. Używam również pakietu tymondesigns/jwt-auth, aby wszystkie odpowiedzi interfejsu API były w formacie JSend JSON.Jak wychwycić globalne wyjątki w laravel 5 generowane przez pakiet tymondesigns/jwt-auth?

W tej chwili próbuję złapać TokenExpiredException, która pojawia się, gdy dany token wygasa oczywiście. Więc próbowałem to w Handler.php:

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

Ale ja nadal nie jestem w stanie złapać ten wyjątek i oddać odpowiedź JSON. Mimo, że jestem w stanie to zrobić dla innych wyjątków, takich jak:

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

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

oraz:

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

Jak obsługiwać inne wyjątki w laravel?

Odpowiedz

4

Wydaje zapomniałem używać nazw:

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

małe błędy! facepalm

+0

Czy to nadal działa z Laravel 5.4? Ponieważ ustawiłem to tak jak powyżej, ale nadal nie przechwytuje wyjątku – gthuo

2

Jeśli ktoś zastanawia się tutaj z tym samym problemem dla nowych Laravel (5.4) i jwt-auth (1.0. * @ Dev) ... teraz jest inna przyczyna/rozwiązanie tego.

Dostawca przechwytuje instancję \Tymon\JWTAuth\Exceptions\TokenExpiredException i ponownie rzuca instancję z Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException. Oryginalny wyjątek jest nadal dostępny w metodzie getPrevious(), więc obsługa błędów wyglądałaby teraz tak:

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); 
}