icingaweb2-module-director/library/vendor/ipl/Html/Error.php

119 lines
2.6 KiB
PHP

<?php
namespace dipl\Html;
use Error as PhpError;
use Exception;
/**
* Class Error
*
* TODO: Eventually allow to (statically) inject a custom error renderer.
*
* @package ipl\Html
*/
abstract class Error
{
/** @var bool */
protected static $showTraces = true;
/**
*
* @param Exception|PhpError|string $error
* @return HtmlDocument
*/
public static function show($error)
{
if ($error instanceof Exception) {
$msg = static::createMessageForException($error);
} elseif ($error instanceof PhpError) {
$msg = static::createMessageForException($error);
} elseif (is_string($error)) {
$msg = $error;
} else {
// TODO: translate?
$msg = 'Got an invalid error';
}
$result = static::renderErrorMessage($msg);
if (static::showTraces()) {
$result->add(Html::tag('pre', $error->getTraceAsString()));
}
return $result;
}
/**
*
* @param Exception|PhpError|string $error
* @return string
*/
public static function render($error)
{
return static::show($error)->render();
}
/**
* @param string
* @return HtmlDocument
*/
protected static function renderErrorMessage($message)
{
$output = new HtmlDocument();
$output->add(
Html::tag('div', ['class' => 'exception'], [
Html::tag('h1', [
Html::tag('i', ['class' => 'icon-bug']),
// TODO: Translate? More hints?
'Oops, an error occurred!'
]),
Html::tag('pre', $message)
])
);
return $output;
}
/**
* @param PhpError|Exception $exception
* @return string
*/
protected static function createMessageForException($exception)
{
$file = preg_split('/[\/\\\]/', $exception->getFile(), -1, PREG_SPLIT_NO_EMPTY);
$file = array_pop($file);
return sprintf(
'%s (%s:%d)',
$exception->getMessage(),
$file,
$exception->getLine()
);
}
/**
* @param bool|null $show
* @return bool
*/
public static function showTraces($show = null)
{
if ($show !== null) {
self::$showTraces = (bool) $show;
}
return self::$showTraces;
}
/**
* @param $any
* @return string
*/
public static function getPhpTypeName($any)
{
if (is_object($any)) {
return get_class($any);
} else {
return gettype($any);
}
}
}