/** * Bootstraps the backend. This function registers an auto loader, parses the configuration * file, configures error handling and logging and finally hands over control to the * Router. * Both the configuration and the logger instance are stored in the * Dashboard\Backend\Application\LifeCycle\RequestScope, with the respective keys *config* * and *logger*. * * @param \stdClass $config The configuration object. * @return void */ public function bootstrap(\stdClass $config) { \spl_autoload_register('Dashboard\\Backend\\Application\\Control\\Autoloader::autoload', true, true); $this->configureErrorHandling(); $config = new Config($config); $sessionService = new Domain\Session\SessionService(); $session = $sessionService->createSession($config->get('session')); $session->start(); $psrService = new Domain\Psr\PsrService(); RequestScope::instance()->set('config', $config); RequestScope::instance()->set('logger', $psrService->createLogger($config)); RequestScope::instance()->set('session', $session); }
public static final function handleError(int $errno, string $errstr, string $errfile = '', int $errline = 0, array $errcontext = array()) : bool { $psrService = new Domain\Psr\PsrService(); try { $logger = null; $scope = RequestScope::instance(); $message = $errstr . ' in file ' . $errfile . ' at line ' . $errline; if ($scope->isDefined('logger')) { $logger = $scope->get('logger'); } else { // To be able to handle errors before the Logger has been created, // we must create the Logger here. This happens for instance when // the Backend::bootstrap() method has not yet finished. // Errors can also occur before the configuration has been parsed. // If that is the case, use a fake logger which just prints // to stderr. if ($scope->isDefined('config')) { $logger = $psrService->createLogger(RequestScope::instance()->get('config')); } else { $logger = new PreBootstrapLogger(); } } switch ($errno) { case E_ERROR: $logger->emergency($message, $errcontext); break; case E_WARNING: $logger->warning($message, $errcontext); break; case E_NOTICE: $logger->notice($message, $errcontext); break; case E_CORE_ERROR: $logger->emergency($message, $errcontext); break; case E_CORE_WARNING: $logger->warning($message, $errcontext); break; case E_COMPILE_ERROR: $logger->emergency($message, $errcontext); break; case E_COMPILE_WARNING: $logger->warning($message, $errcontext); break; case E_USER_ERROR: $logger->emergency($message, $errcontext); break; case E_USER_WARNING: $logger->warning($message, $errcontext); break; case E_USER_NOTICE: $logger->notice($message, $errcontext); break; case E_STRICT: $logger->debug($message, $errcontext); break; case E_RECOVERABLE_ERROR: $logger->critical($message, $errcontext); break; case E_DEPRECATED: $logger->notice($message, $errcontext); break; case E_USER_DEPRECATED: $logger->notice($message, $errcontext); break; default: $logger->info($message, $errcontext); break; } } catch (\Throwable $ex) { $fd = @\fopen('php://stderr', 'w'); @\fwrite($fd, "Error '{$errstr}' in file '{$errfile}' at line '{$errline}'\n"); @\fclose($fd); } // Stop handling errors after this. return true; }