app = $app; // $this->registerHandlers(); } public function registerHandlers() { error_reporting(-1); set_error_handler([$this, 'handleError']); set_exception_handler([$this, 'handleException']); register_shutdown_function([$this, 'handleShutdown']); } public function handleError($severity, $message, $file = '', $line = 0) { try { if (error_reporting() & $severity) { throw new \ErrorException($message, 0, $severity, $file, $line); } } catch(\Exception $e) { $this->handleException($e); } } public function handleException($e) { try { if ($this->app->getEnv() != 'production') { $this->report($e); $this->render($e); } } catch (\Exception $e) { wp_die( '
'
. $e->getMessage().' : '.$e->getFile().' ('.$e->getLine().')' .
''
);
}
}
public function handleShutdown()
{
if (!is_null($error = error_get_last()) && $this->isFatal($error['type'])) {
$this->handleException(new \ErrorException(
$error['message'], 0, $error['type'], $error['file'], $error['line']
));
}
}
public function report($e)
{
$logDir = $this->app->storagePath('logs');
if (!is_readable($logDir)) {
mkdir($logDir, 0777);
}
//Log in: wp-content/debug.log
if (defined('WP_DEBUG_LOG') && WP_DEBUG_LOG) {
error_log((string) $e);
}
//Log in: plugin-root-dir/storage/logs/error.log
error_log(
'['.current_time('mysql').'] ' . (string) $e,
self::APPEND_TO_LOG_FILE,
$logDir.'/error.log'
);
}
public function render($e)
{
echo get_class($e) .' : '. $e->getMessage() . ' in ' . $e->getFile() . ' (' . $e->getLine() . ')';
echo '' . str_replace("\n", '
', $e->getTraceAsString()) . '';
}
protected function isFatal($type)
{
return in_array($type, [E_COMPILE_ERROR, E_CORE_ERROR, E_ERROR, E_PARSE]);
}
}