public static function index(Request $request, TestInjection $ti) { Logger::log(Logger::INFO, 'example log message'); return 'path: ' . $request->getUri()->getPath() . ', random injection data: ' . $ti->getSomeData() . ', next up: ' . Router::link('example.test2', ['user' => new User(1)])->setQueryParameters(['foo' => 'b a r'])->getAbsolute(); }
private static function init() { set_exception_handler(function ($e) { if (isset(self::$exceptionHandlers[get_class($e)])) { $handler = self::$exceptionHandlers[get_class($e)]; if ($handler($e)) { return; } } if ($e instanceof RouteNotFoundException) { // exception for a special exception; if a user mistypes a URL, show a 404 not found page. (new ErrorResponse(new TemplateResponse('page_not_found', ['exception' => $e]), 404))->render(); return; } if ($e instanceof RouteParameterException) { $data = ['exception' => $e]; (new ErrorResponse(new TemplateResponse('route_invalid_parameters', $data), 404))->render(); return; } if ($e instanceof UnexpectedValueException) { $trace = $e->getTrace(); if (isset($trace[0]['class']) && $trace[0]['class'] === LogException::class && stripos($e->getMessage(), 'check permissions') !== false) { error_log('Cannot write to app log files, please check permissions for ' . LOG_DIR); (new ExceptionResponse($e))->render(); return; } } Logger::log(Logger::CRITICAL, strval($e)); (new ExceptionResponse($e))->render(); }); set_error_handler(function ($errno, $errstr, $file, $line) { static $logLevels = [E_NOTICE => Logger::NOTICE, E_USER_NOTICE => Logger::NOTICE, E_STRICT => Logger::NOTICE, E_DEPRECATED => Logger::NOTICE, E_USER_DEPRECATED => Logger::NOTICE, E_WARNING => Logger::WARNING, E_USER_WARNING => Logger::WARNING, E_ERROR => Logger::ERROR, E_RECOVERABLE_ERROR => Logger::ERROR, E_USER_ERROR => Logger::ERROR]; $message = 'Error in file ' . $file . ', line ' . $line . ':' . PHP_EOL . $errstr . ' (code: ' . $errno . ')'; Logger::log($logLevels[$errno] ?? Logger::ERROR, $message); (new ErrorResponse($message))->render(); if (isset($logLevels[$errno]) && $logLevels[$errno] === Logger::NOTICE) { // notice level errors usually don't break code, so we continue; // it has been logged and displayed already anyway return false; } return true; }); register_shutdown_function(function () { /** * @param Exception|Throwable $e */ $log = function ($e) { Logger::log(Logger::CRITICAL, sprintf("%s thrown in shutdown handler: %s\n%s", get_class($e), $e->getMessage(), $e->getTraceAsString())); }; foreach (self::$shutdownHandlers as $handler) { try { $handler(); } catch (Throwable $t) { $log($t); } } }); }