diff options
Diffstat (limited to 'src/Exceptions/Handlers')
-rw-r--r-- | src/Exceptions/Handlers/HandlerInterface.php | 21 | ||||
-rw-r--r-- | src/Exceptions/Handlers/Legacy.php | 42 | ||||
-rw-r--r-- | src/Exceptions/Handlers/LegacyDevelopment.php | 57 | ||||
-rw-r--r-- | src/Exceptions/Handlers/Whoops.php | 85 |
4 files changed, 205 insertions, 0 deletions
diff --git a/src/Exceptions/Handlers/HandlerInterface.php b/src/Exceptions/Handlers/HandlerInterface.php new file mode 100644 index 00000000..9de33e1f --- /dev/null +++ b/src/Exceptions/Handlers/HandlerInterface.php @@ -0,0 +1,21 @@ +<?php + +namespace Engelsystem\Exceptions\Handlers; + +use Engelsystem\Http\Request; +use Throwable; + +interface HandlerInterface +{ + /** + * @param Request $request + * @param Throwable $e + */ + public function render($request, Throwable $e); + + /** + * @param Throwable $e + * @return + */ + public function report(Throwable $e); +} diff --git a/src/Exceptions/Handlers/Legacy.php b/src/Exceptions/Handlers/Legacy.php new file mode 100644 index 00000000..39683f72 --- /dev/null +++ b/src/Exceptions/Handlers/Legacy.php @@ -0,0 +1,42 @@ +<?php + +namespace Engelsystem\Exceptions\Handlers; + +use Engelsystem\Http\Request; +use Throwable; + +class Legacy implements HandlerInterface +{ + /** + * @param Request $request + * @param Throwable $e + */ + public function render($request, Throwable $e) + { + echo 'An <del>un</del>expected error occurred, a team of untrained monkeys has been dispatched to deal with it.'; + } + + /** + * @param Throwable $e + */ + public function report(Throwable $e) + { + error_log(sprintf('Exception: Code: %s, Message: %s, File: %s:%u, Trace: %s', + $e->getCode(), + $e->getMessage(), + $this->stripBasePath($e->getFile()), + $e->getLine(), + json_encode($e->getTrace()) + )); + } + + /** + * @param string $path + * @return string + */ + protected function stripBasePath($path) + { + $basePath = realpath(__DIR__ . '/../../..') . '/'; + return str_replace($basePath, '', $path); + } +} diff --git a/src/Exceptions/Handlers/LegacyDevelopment.php b/src/Exceptions/Handlers/LegacyDevelopment.php new file mode 100644 index 00000000..86f86f4c --- /dev/null +++ b/src/Exceptions/Handlers/LegacyDevelopment.php @@ -0,0 +1,57 @@ +<?php + +namespace Engelsystem\Exceptions\Handlers; + +use Engelsystem\Http\Request; +use Throwable; + +class LegacyDevelopment extends Legacy +{ + /** + * @param Request $request + * @param Throwable $e + */ + public function render($request, Throwable $e) + { + $file = $this->stripBasePath($e->getFile()); + + echo '<pre style="background-color:#333;color:#ccc;z-index:1000;position:fixed;bottom:1em;padding:1em;width:97%;max-height: 90%;overflow-y:auto;">'; + echo sprintf('%s: (%s)' . PHP_EOL, get_class($e), $e->getCode()); + $data = [ + 'string' => $e->getMessage(), + 'file' => $file . ':' . $e->getLine(), + 'stacktrace' => $this->formatStackTrace($e->getTrace()), + ]; + var_dump($data); + echo '</pre>'; + } + + /** + * @param array $stackTrace + * @return array + */ + protected function formatStackTrace($stackTrace) + { + $return = []; + $stackTrace = array_reverse($stackTrace); + + foreach ($stackTrace as $trace) { + $path = ''; + $line = ''; + + if (isset($trace['file']) && isset($trace['line'])) { + $path = $this->stripBasePath($trace['file']); + $line = $trace['line']; + } + + $functionName = $trace['function']; + + $return[] = [ + 'file' => $path . ':' . $line, + $functionName => isset($trace['args']) ? $trace['args'] : null, + ]; + } + + return $return; + } +} diff --git a/src/Exceptions/Handlers/Whoops.php b/src/Exceptions/Handlers/Whoops.php new file mode 100644 index 00000000..807f5eb0 --- /dev/null +++ b/src/Exceptions/Handlers/Whoops.php @@ -0,0 +1,85 @@ +<?php + +namespace Engelsystem\Exceptions\Handlers; + +use Engelsystem\Application; +use Engelsystem\Container\Container; +use Engelsystem\Http\Request; +use Throwable; +use Whoops\Handler\JsonResponseHandler; +use Whoops\Handler\PrettyPageHandler; +use Whoops\Run as WhoopsRunner; + +class Whoops extends Legacy implements HandlerInterface +{ + /** @var Application */ + protected $app; + + public function __construct(Container $app) + { + $this->app = $app; + } + + /** + * @param Request $request + * @param Throwable $e + */ + public function render($request, Throwable $e) + { + $whoops = $this->app->make(WhoopsRunner::class); + $handler = $this->getPrettyPageHandler($e); + $whoops->pushHandler($handler); + + if ($request->isXmlHttpRequest()) { + $handler = $this->getJsonResponseHandler(); + $whoops->pushHandler($handler); + } + + echo $whoops->handleException($e); + } + + /** + * @param Throwable $e + * @return PrettyPageHandler + */ + protected function getPrettyPageHandler(Throwable $e) + { + $handler = $this->app->make(PrettyPageHandler::class); + + $handler->setPageTitle('Just another ' . get_class($e) . ' to fix :('); + $handler->setApplicationPaths([realpath(__DIR__ . '/../..')]); + + $data = $this->getData(); + $handler->addDataTable('Application', $data); + + return $handler; + } + + /** + * @return JsonResponseHandler + */ + protected function getJsonResponseHandler() + { + $handler = $this->app->make(JsonResponseHandler::class); + $handler->setJsonApi(true); + $handler->addTraceToOutput(true); + + return $handler; + } + + /** + * Aggregate application data + * + * @return array + */ + protected function getData() + { + global $user; + + $data = []; + $data['user'] = $user; + $data['Booted'] = $this->app->isBooted(); + + return $data; + } +} |