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,115 +18,13 @@ 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
+ * Activate the error handler
*/
- public function errorHandler($number, $string, $file, $line, $context)
+ public function register()
{
- $trace = array_reverse(debug_backtrace());
-
- $this->handle('error', $number, $string, $file, $line, $context, $trace);
- }
-
- /**
- * @param Throwable $e
- */
- public function exceptionHandler($e)
- {
- $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
- */
- 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);
}
/**
@@ -138,4 +34,12 @@ class Handler
{
$this->environment = $environment;
}
+
+ /**
+ * @return string
+ */
+ public function getEnvironment()
+ {
+ 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());
+ }
+}