* @link https://www.oxidmodule.com */ declare(strict_types=1); namespace D3\DebugBar\Core; use D3\DebugBar\Application\Models\AvailabilityCheck; use D3\DebugBar\Application\Models\Exceptions\CompileErrorException; use D3\DebugBar\Application\Models\Exceptions\CoreErrorException; use D3\DebugBar\Application\Models\Exceptions\ParseException; use D3\DebugBar\Application\Models\Exceptions\UserErrorException; use ErrorException; use OxidEsales\Eshop\Core\Registry; class DebugBarErrorHandler { /** * @param int $severity * @param string $message * @param string $file * @param int $line * * @return void|false * @throws CompileErrorException * @throws CoreErrorException * @throws ErrorException * @throws ParseException * @throws UserErrorException */ public function callback(int $severity, string $message, string $file, int $line) { AvailabilityCheck::markErrorOccured(); if (0 === error_reporting() || !(error_reporting() & $severity)) { // This error code is not included in error_reporting. return false; } $smartyTemplate = $this->getSmartyTemplateLocationFromError($message); if (is_array($smartyTemplate)) { [ $file, $line ] = $smartyTemplate; } throw match ($severity) { E_CORE_ERROR => new CoreErrorException($message, 0, $severity, $file, $line), E_COMPILE_ERROR => new CompileErrorException($message, 0, $severity, $file, $line), E_USER_ERROR => new UserErrorException($message, 0, $severity, $file, $line), E_PARSE => new ParseException($message, 0, $severity, $file, $line), E_ERROR => new ErrorException($message, 0, $severity, $file, $line), default => $this->handleUnregisteredErrorTypes($message, $severity, $file, $line), }; } /** * @param string $messsage * @return array|null */ protected function getSmartyTemplateLocationFromError(string $messsage): ?array { if (stristr($messsage, 'Smarty error: [in ')) { $start = strpos($messsage, '[') + 1; $end = strpos($messsage, ']'); $parts = explode(' ', substr($messsage, $start, $end - $start)); return [Registry::getConfig()->getTemplateDir(isAdmin()).$parts[1], (int) $parts[3]]; } return null; } /** * @param string $message * @param int $severity * @param string $file * @param int $line * @return void * * @throws ErrorException */ protected function handleUnregisteredErrorTypes( string $message = '', int $severity = 1, string $file = __FILE__, int $line = __LINE__ ): void { throw new ErrorException($message, 0, $severity, $file, $line); } }