diff --git a/includes/engelsystem.php b/includes/engelsystem.php index 97076895..688ce49f 100644 --- a/includes/engelsystem.php +++ b/includes/engelsystem.php @@ -2,7 +2,7 @@ use Engelsystem\Application; use Engelsystem\Config\Config; -use Engelsystem\Exceptions\Handler as ExceptionHandler; +use Engelsystem\Exceptions\BasicHandler as ExceptionHandler; /** * This file includes all needed functions, connects to the db etc. diff --git a/src/Exceptions/BasicHandler.php b/src/Exceptions/BasicHandler.php new file mode 100644 index 00000000..2ba960a2 --- /dev/null +++ b/src/Exceptions/BasicHandler.php @@ -0,0 +1,119 @@ +exceptionHandler($exception); + } + + /** + * @param Throwable $e + */ + public function exceptionHandler($e) + { + $this->handle( + $e->getCode(), + get_class($e) . ': ' . $e->getMessage(), + $e->getFile(), + $e->getLine(), + ['exception' => $e] + ); + } + + /** + * @param int $number + * @param string $string + * @param string $file + * @param int $line + * @param array $context + * @param array $trace + */ + protected function handle($number, $string, $file, $line, $context = [], $trace = []) + { + error_log(sprintf('Exception: Number: %s, String: %s, File: %s:%u, Context: %s', + $number, + $string, + $file, + $line, + json_encode($context) + )); + + $file = $this->stripBasePath($file); + + if ($this->environment == self::ENV_DEVELOPMENT) { + echo '
';
+            echo sprintf('%s: (%s)' . PHP_EOL, ucfirst($type), $number);
+            var_export([
+                'string'     => $string,
+                'file'       => $file . ':' . $line,
+                'context'    => $context,
+                'stacktrace' => $this->formatStackTrace($trace),
+            ]);
+            echo '
'; + die(); + } + + echo 'An unexpected error occurred, a team of untrained monkeys has been dispatched to deal with it.'; + die(); + } + + /** + * @param array $stackTrace + * @return array + */ + protected function formatStackTrace($stackTrace) + { + $return = []; + + 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 => $trace['args'], + ]; + } + + return $return; + } + + /** + * @param string $path + * @return string + */ + protected function stripBasePath($path) + { + $basePath = realpath(__DIR__ . '/../..') . '/'; + return str_replace($basePath, '', $path); + } +} diff --git a/src/Exceptions/ExceptionsServiceProvider.php b/src/Exceptions/ExceptionsServiceProvider.php index 7755e1e7..8eeccf61 100644 --- a/src/Exceptions/ExceptionsServiceProvider.php +++ b/src/Exceptions/ExceptionsServiceProvider.php @@ -3,13 +3,14 @@ namespace Engelsystem\Exceptions; use Engelsystem\Container\ServiceProvider; -use Engelsystem\Exceptions\Handler as ExceptionHandler; class ExceptionsServiceProvider extends ServiceProvider { public function register() { - $errorHandler = $this->app->make(ExceptionHandler::class); + $errorHandler = $this->app->make(BasicHandler::class); + $errorHandler->register(); $this->app->instance('error.handler', $errorHandler); + $this->app->bind(Handler::class, 'error.handler'); } } diff --git a/src/Exceptions/Handler.php b/src/Exceptions/Handler.php index 95bcd132..cdf94e32 100644 --- a/src/Exceptions/Handler.php +++ b/src/Exceptions/Handler.php @@ -2,9 +2,7 @@ namespace Engelsystem\Exceptions; -use Throwable; - -class Handler +abstract class Handler { /** @var string */ protected $environment; @@ -20,122 +18,28 @@ class Handler public function __construct($environment = self::ENV_PRODUCTION) { $this->environment = $environment; - - set_error_handler([$this, 'errorHandler']); - set_exception_handler([$this, 'exceptionHandler']); - } - - /** - * @param int $number - * @param string $string - * @param string $file - * @param int $line - * @param array $context - */ - public function errorHandler($number, $string, $file, $line, $context) - { - $trace = array_reverse(debug_backtrace()); - - $this->handle('error', $number, $string, $file, $line, $context, $trace); } /** - * @param Throwable $e + * Activate the error handler */ - public function exceptionHandler($e) + public function register() { - $this->handle( - 'exception', - $e->getCode(), - get_class($e) . ': ' . $e->getMessage(), - $e->getFile(), - $e->getLine(), - ['exception' => $e] - ); - } - - /** - * @param string $type - * @param int $number - * @param string $string - * @param string $file - * @param int $line - * @param array $context - * @param array $trace - */ - protected function handle($type, $number, $string, $file, $line, $context = [], $trace = []) - { - error_log(sprintf('%s: Number: %s, String: %s, File: %s:%u, Context: %s', - $type, - $number, - $string, - $file, - $line, - json_encode($context) - )); - - $file = $this->stripBasePath($file); - - if ($this->environment == self::ENV_DEVELOPMENT) { - echo '
';
-            echo sprintf('%s: (%s)' . PHP_EOL, ucfirst($type), $number);
-            var_export([
-                'string'     => $string,
-                'file'       => $file . ':' . $line,
-                'context'    => $context,
-                'stacktrace' => $this->formatStackTrace($trace),
-            ]);
-            echo '
'; - die(); - } - - echo 'An unexpected error occurred, a team of untrained monkeys has been dispatched to deal with it.'; - die(); } /** - * @param array $stackTrace - * @return array + * @param string $environment */ - protected function formatStackTrace($stackTrace) + public function setEnvironment($environment) { - $return = []; - - 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 => $trace['args'], - ]; - } - - return $return; + $this->environment = $environment; } /** - * @param string $path * @return string */ - protected function stripBasePath($path) + public function getEnvironment() { - $basePath = realpath(__DIR__ . '/../..') . '/'; - return str_replace($basePath, '', $path); - } - - /** - * @param string $environment - */ - public function setEnvironment($environment) - { - $this->environment = $environment; + return $this->environment; } } diff --git a/tests/Unit/Exceptions/ExceptionsServiceProviderTest.php b/tests/Unit/Exceptions/ExceptionsServiceProviderTest.php index 9c943d52..01fb2f11 100644 --- a/tests/Unit/Exceptions/ExceptionsServiceProviderTest.php +++ b/tests/Unit/Exceptions/ExceptionsServiceProviderTest.php @@ -2,8 +2,9 @@ namespace Engelsystem\Test\Unit\Exceptions; +use Engelsystem\Exceptions\BasicHandler as ExceptionHandler; use Engelsystem\Exceptions\ExceptionsServiceProvider; -use Engelsystem\Exceptions\Handler as ExceptionHandler; +use Engelsystem\Exceptions\Handler; use Engelsystem\Test\Unit\ServiceProviderTest; use PHPUnit_Framework_MockObject_MockObject; @@ -18,10 +19,11 @@ class ExceptionsServiceProviderTest extends ServiceProviderTest $exceptionHandler = $this->getMockBuilder(ExceptionHandler::class) ->getMock(); - $app = $this->getApp(); + $app = $this->getApp(['make', 'instance', 'bind']); $this->setExpects($app, 'make', [ExceptionHandler::class], $exceptionHandler); $this->setExpects($app, 'instance', ['error.handler', $exceptionHandler]); + $this->setExpects($app, 'bind', [Handler::class, 'error.handler']); $serviceProvider = new ExceptionsServiceProvider($app); $serviceProvider->register(); diff --git a/tests/Unit/Exceptions/HandlerTest.php b/tests/Unit/Exceptions/HandlerTest.php new file mode 100644 index 00000000..29759be7 --- /dev/null +++ b/tests/Unit/Exceptions/HandlerTest.php @@ -0,0 +1,38 @@ +getMockForAbstractClass(Handler::class); + $this->assertInstanceOf(Handler::class, $handler); + $handler->register(); + } + + /** + * @covers \Engelsystem\Exceptions\Handler::setEnvironment() + * @covers \Engelsystem\Exceptions\Handler::getEnvironment() + */ + public function testEnvironment() + { + /** @var Handler|Mock $handler */ + $handler = $this->getMockForAbstractClass(Handler::class); + + $handler->setEnvironment(Handler::ENV_DEVELOPMENT); + $this->assertEquals(Handler::ENV_DEVELOPMENT, $handler->getEnvironment()); + + $handler->setEnvironment(Handler::ENV_PRODUCTION); + $this->assertEquals(Handler::ENV_PRODUCTION, $handler->getEnvironment()); + } +}