Added ExceptionHandler Interface
parent
e54a10b816
commit
6eea072376
@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
namespace Engelsystem\Exceptions;
|
||||
|
||||
use ErrorException;
|
||||
use Throwable;
|
||||
|
||||
class BasicHandler extends Handler
|
||||
{
|
||||
/**
|
||||
* Activate the error handler
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
set_error_handler([$this, 'errorHandler']);
|
||||
set_exception_handler([$this, 'exceptionHandler']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $number
|
||||
* @param string $message
|
||||
* @param string $file
|
||||
* @param int $line
|
||||
*/
|
||||
public function errorHandler($number, $message, $file, $line)
|
||||
{
|
||||
$exception = new ErrorException($message, 0, $number, $file, $line);
|
||||
$this->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 '<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, ucfirst($type), $number);
|
||||
var_export([
|
||||
'string' => $string,
|
||||
'file' => $file . ':' . $line,
|
||||
'context' => $context,
|
||||
'stacktrace' => $this->formatStackTrace($trace),
|
||||
]);
|
||||
echo '</pre>';
|
||||
die();
|
||||
}
|
||||
|
||||
echo 'An <del>un</del>expected 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);
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace Engelsystem\Test\Unit\Exceptions;
|
||||
|
||||
use Engelsystem\Exceptions\Handler;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use PHPUnit_Framework_MockObject_MockObject as Mock;
|
||||
|
||||
class HandlerTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @covers \Engelsystem\Exceptions\Handler::__construct()
|
||||
* @covers \Engelsystem\Exceptions\Handler::register()
|
||||
*/
|
||||
public function testRegister()
|
||||
{
|
||||
/** @var Handler|Mock $handler */
|
||||
$handler = $this->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());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue