Created
March 19, 2017 05:13
-
-
Save flyingluscas/4de88f980dfb5c6b0825f853cb67f7ea to your computer and use it in GitHub Desktop.
Handling exceptions with JSON responses.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Exceptions; | |
use Exception; | |
use Illuminate\Auth\AuthenticationException; | |
use Symfony\Component\HttpFoundation\Response; | |
use Symfony\Component\HttpKernel\Exception\HttpException; | |
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; | |
class Handler extends ExceptionHandler | |
{ | |
/** | |
* A list of the exception types that should not be reported. | |
* | |
* @var array | |
*/ | |
protected $dontReport = [ | |
\Illuminate\Auth\AuthenticationException::class, | |
\Illuminate\Auth\Access\AuthorizationException::class, | |
\Symfony\Component\HttpKernel\Exception\HttpException::class, | |
\Illuminate\Database\Eloquent\ModelNotFoundException::class, | |
\Illuminate\Session\TokenMismatchException::class, | |
\Illuminate\Validation\ValidationException::class, | |
]; | |
/** | |
* Report or log an exception. | |
* | |
* This is a great spot to send exceptions to Sentry, Bugsnag, etc. | |
* | |
* @param \Exception $exception | |
* @return void | |
*/ | |
public function report(Exception $exception) | |
{ | |
parent::report($exception); | |
} | |
/** | |
* Render an exception into an HTTP response. | |
* | |
* @param \Illuminate\Http\Request $request | |
* @param \Exception $exception | |
* @return \Illuminate\Http\Response | |
*/ | |
public function render($request, Exception $exception) | |
{ | |
if ($exception instanceof HttpException) { | |
return $this->handleHttpExceptionResponse($exception); | |
} | |
if ($exception instanceof ModelNotFoundException) { | |
return $this->errorResponse('Not Found', Response::HTTP_NOT_FOUND); | |
} | |
return parent::render($request, $exception); | |
} | |
/** | |
* Handle HTTP exceptions with a JSON response. | |
* | |
* @param HttpException $exception | |
* | |
* @return \Illuminate\Http\JsonResponse | |
*/ | |
protected function handleHttpExceptionResponse(HttpException $exception) | |
{ | |
$status = $exception->getStatusCode(); | |
$message = Response::$statusTexts[$status]; | |
return $this->errorResponse($message, $status); | |
} | |
/** | |
* Make a JSON error response. | |
* | |
* @param string $message | |
* @param int $status | |
* | |
* @return \Illuminate\Http\JsonResponse | |
*/ | |
protected function errorResponse($message, $status) | |
{ | |
return response()->json([ | |
'error' => $message, | |
], $status); | |
} | |
/** | |
* Convert an authentication exception into an unauthenticated response. | |
* | |
* @param \Illuminate\Http\Request $request | |
* @param \Illuminate\Auth\AuthenticationException $exception | |
* @return \Illuminate\Http\Response | |
*/ | |
protected function unauthenticated($request, AuthenticationException $exception) | |
{ | |
if ($request->expectsJson()) { | |
return response()->json(['error' => 'Unauthenticated.'], 401); | |
} | |
return redirect()->guest(route('login')); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment