Created
October 4, 2016 14:17
-
-
Save shaneparsons/adeca3108b4fcaa15442b51dee70c4c4 to your computer and use it in GitHub Desktop.
Lumen - Custom 403 compatibility
This file contains 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 Laravel\Lumen\Concerns; | |
use Error; | |
use Exception; | |
use ErrorException; | |
use Symfony\Component\Console\Output\ConsoleOutput; | |
use Symfony\Component\HttpKernel\Exception\HttpException; | |
use Symfony\Component\Debug\Exception\FatalErrorException; | |
use Symfony\Component\Debug\Exception\FatalThrowableError; | |
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | |
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | |
trait RegistersExceptionHandlers | |
{ | |
/** | |
* Throw an HttpException with the given data. | |
* | |
* @param int $code | |
* @param string $message | |
* @param array $headers | |
* @return void | |
* | |
* @throws \Symfony\Component\HttpKernel\Exception\HttpException | |
*/ | |
public function abort($code, $message = '', array $headers = []) | |
{ | |
if ($code == 403) { | |
throw new AccessDeniedHttpException($message); | |
} | |
if ($code == 404) { | |
throw new NotFoundHttpException($message); | |
} | |
throw new HttpException($code, $message, null, $headers); | |
} | |
/** | |
* Set the error handling for the application. | |
* | |
* @return void | |
*/ | |
protected function registerErrorHandling() | |
{ | |
error_reporting(-1); | |
set_error_handler(function ($level, $message, $file = '', $line = 0) { | |
if (error_reporting() & $level) { | |
throw new ErrorException($message, 0, $level, $file, $line); | |
} | |
}); | |
set_exception_handler(function ($e) { | |
$this->handleUncaughtException($e); | |
}); | |
register_shutdown_function(function () { | |
$this->handleShutdown(); | |
}); | |
} | |
/** | |
* Handle the application shutdown routine. | |
* | |
* @return void | |
*/ | |
protected function handleShutdown() | |
{ | |
if (! is_null($error = error_get_last()) && $this->isFatalError($error['type'])) { | |
$this->handleUncaughtException(new FatalErrorException( | |
$error['message'], $error['type'], 0, $error['file'], $error['line'] | |
)); | |
} | |
} | |
/** | |
* Determine if the error type is fatal. | |
* | |
* @param int $type | |
* @return bool | |
*/ | |
protected function isFatalError($type) | |
{ | |
$errorCodes = [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE]; | |
if (defined('FATAL_ERROR')) { | |
$errorCodes[] = FATAL_ERROR; | |
} | |
return in_array($type, $errorCodes); | |
} | |
/** | |
* Send the exception to the handler and return the response. | |
* | |
* @param \Throwable $e | |
* @return Response | |
*/ | |
protected function sendExceptionToHandler($e) | |
{ | |
$handler = $this->resolveExceptionHandler(); | |
if ($e instanceof Error) { | |
$e = new FatalThrowableError($e); | |
} | |
$handler->report($e); | |
return $handler->render($this->make('request'), $e); | |
} | |
/** | |
* Handle an uncaught exception instance. | |
* | |
* @param \Throwable $e | |
* @return void | |
*/ | |
protected function handleUncaughtException($e) | |
{ | |
$handler = $this->resolveExceptionHandler(); | |
if ($e instanceof Error) { | |
$e = new FatalThrowableError($e); | |
} | |
$handler->report($e); | |
if ($this->runningInConsole()) { | |
$handler->renderForConsole(new ConsoleOutput, $e); | |
} else { | |
$handler->render($this->make('request'), $e)->send(); | |
} | |
} | |
/** | |
* Get the exception handler from the container. | |
* | |
* @return mixed | |
*/ | |
protected function resolveExceptionHandler() | |
{ | |
if ($this->bound('Illuminate\Contracts\Debug\ExceptionHandler')) { | |
return $this->make('Illuminate\Contracts\Debug\ExceptionHandler'); | |
} else { | |
return $this->make('Laravel\Lumen\Exceptions\Handler'); | |
} | |
} | |
} |
Author
shaneparsons
commented
Oct 11, 2016
•
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment