Use Twig-only rendering and improve error fallback

Remove legacy PHP view fallbacks and always render Twig templates (Controller, Router). Update ErrorHandler to attempt Twig rendering and provide a safe, escaped minimal HTML fallback on failure instead of requiring PHP views. Also pass whoisData into the domain view. These changes standardize on Twig templates and harden error output.
This commit is contained in:
Hosteroid
2026-03-04 11:16:56 +02:00
parent 2c906532df
commit db094d6d8b
4 changed files with 23 additions and 47 deletions

View File

@@ -844,6 +844,7 @@ class DomainController extends Controller
$this->view('domains/view', [ $this->view('domains/view', [
'domain' => $formattedDomain, 'domain' => $formattedDomain,
'whoisData' => $whoisData,
'logs' => $logs, 'logs' => $logs,
'availableTags' => $availableTags, 'availableTags' => $availableTags,
'title' => $domain['domain_name'] 'title' => $domain['domain_name']

View File

@@ -296,33 +296,28 @@ class ErrorHandler
$request_data = json_decode($errorData['request_data'], true); $request_data = json_decode($errorData['request_data'], true);
$session_data = json_decode($errorData['session_data'], true); $session_data = json_decode($errorData['session_data'], true);
// Display debug page in development, clean 500 in production
$twigTemplate = $this->isDevelopment ? 'errors/debug.twig' : 'errors/500.twig'; $twigTemplate = $this->isDevelopment ? 'errors/debug.twig' : 'errors/500.twig';
$twigFile = __DIR__ . '/../Views/' . $twigTemplate;
if (file_exists($twigFile)) { try {
try { $memory_usage_mb = round(($memory_usage ?? 0) / 1024 / 1024, 2);
$memory_usage_mb = round(($memory_usage ?? 0) / 1024 / 1024, 2); $peak_memory_mb = round(memory_get_peak_usage(true) / 1024 / 1024, 2);
$peak_memory_mb = round(memory_get_peak_usage(true) / 1024 / 1024, 2); $errorContext = compact(
$errorContext = compact( 'error_id', 'error_type', 'error_message', 'error_file', 'error_line',
'error_id', 'error_type', 'error_message', 'error_file', 'error_line', 'stack_trace', 'request_method', 'request_uri', 'user_agent',
'stack_trace', 'request_method', 'request_uri', 'user_agent', 'ip_address', 'php_version', 'memory_usage', 'memory_usage_mb',
'ip_address', 'php_version', 'memory_usage', 'memory_usage_mb', 'peak_memory_mb', 'occurred_at', 'user_info', 'request_data', 'session_data'
'peak_memory_mb', 'occurred_at', 'user_info', 'request_data', 'session_data' );
); echo \Core\TwigService::getInstance()->render($twigTemplate, $errorContext);
echo \Core\TwigService::getInstance()->render($twigTemplate, $errorContext); } catch (\Throwable $e) {
} catch (\Throwable $e) { $safeId = htmlspecialchars($error_id, ENT_QUOTES, 'UTF-8');
// Twig itself failed — fall back to raw PHP view if ($this->isDevelopment) {
if ($this->isDevelopment) { $safeMsg = htmlspecialchars($error_message, ENT_QUOTES, 'UTF-8');
require __DIR__ . '/../Views/errors/debug.php'; $safeFile = htmlspecialchars($error_file, ENT_QUOTES, 'UTF-8');
} else { echo "<h1>Internal Server Error</h1><p><strong>ID:</strong> {$safeId}</p>"
require __DIR__ . '/../Views/errors/500.php'; . "<p>{$safeMsg} in {$safeFile}:{$error_line}</p>";
} } else {
echo "<h1>Internal Server Error</h1><p>Reference: {$safeId}</p>";
} }
} elseif ($this->isDevelopment) {
require __DIR__ . '/../Views/errors/debug.php';
} else {
require __DIR__ . '/../Views/errors/500.php';
} }
exit; exit;

View File

@@ -6,23 +6,8 @@ abstract class Controller
{ {
protected function view(string $view, array $data = []): void protected function view(string $view, array $data = []): void
{ {
$twigPath = __DIR__ . "/../app/Views/$view.twig"; $twig = TwigService::getInstance();
echo $twig->render("$view.twig", $data);
if (file_exists($twigPath)) {
$twig = TwigService::getInstance();
echo $twig->render("$view.twig", $data);
return;
}
// Fallback to legacy PHP view during migration
extract($data);
$viewPath = __DIR__ . "/../app/Views/$view.php";
if (!file_exists($viewPath)) {
throw new \Exception("View not found: $view");
}
require $viewPath;
} }
protected function json($data, int $status = 200): void protected function json($data, int $status = 200): void

View File

@@ -72,12 +72,7 @@ class Router
// Silently fail if logging is not available // Silently fail if logging is not available
} }
$twigPath = __DIR__ . '/../app/Views/errors/404.twig'; echo TwigService::getInstance()->render('errors/404.twig');
if (file_exists($twigPath)) {
echo TwigService::getInstance()->render('errors/404.twig');
} else {
require_once __DIR__ . '/../app/Views/errors/404.php';
}
return; return;
} }