Я работаю над приложением RESTful, использующим Laravel 5, и пытаюсь перехватить исключения и сгенерировать соответствующий ответ. Я также использую tymondesigns / JWT-авт пакет так, чтобы все ответы API были в формате JSend JSON.
Прямо сейчас я пытаюсь поймать TokenExpiredException
который возникает, когда истекает срок действия данного токена. Так что я попробовал это в Handler.php
:
if($e instanceof TokenExpiredException)
{
return jsend()->error()
->message("Token Expired")
->code(403)
->data([null])
->get();
}
Но я все еще не могу поймать это исключение и дать ответ JSON. Хотя я могу сделать это для других исключений, таких как:
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
return jsend()->error()
->message("404 Model Not Found")
->data([null])
->get();
}
А также:
if ($this->isHttpException($e))
{
if($e instanceof NotFoundHttpException)
{
return jsend()->error()
->message("404 Route Not Found")
->data([null])
->get();
}
return $this->renderHttpException($e);
}
Как обрабатывать другие исключения в Laravel?
Кажется, я забыл использовать пространство имен:
if($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException)
{
return jsend()->error()
->message("Token Expired")
->code(403)
->data([null])
->get();
}
Маленькие ошибки! Facepalm
Если кто-то задается вопросом с такой же проблемой для новых Laravel (5.4) и jwt-auth (1.0. * @ Dev) … теперь есть другая причина / решение для этого.
Провайдер ловит экземпляр \Tymon\JWTAuth\Exceptions\TokenExpiredException
и отбрасывает экземпляр Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
, Исходное исключение все еще доступно с методом getPrevious()
поэтому обработка ошибок теперь будет выглядеть примерно так:
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);
}