error_reporting(E_ALL); ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); ini_set('log_errors', '1'); ini_set('session.use_strict_mode', '1'); ini_set('session.use_only_cookies', '1'); ini_set('session.cookie_httponly', '1'); ini_set('session.cookie_samesite', 'Lax'); session_set_cookie_params([ 'lifetime' => 0, 'path' => '/', 'domain' => '', 'secure' => !empty($_SERVER['HTTPS']), 'httponly' => true, 'samesite' => 'Lax', ]); session_start(); date_default_timezone_set('UTC'); define('BASE_PATH', __DIR__); define('APP_PATH', BASE_PATH . '/app'); define('CONFIG_PATH', BASE_PATH . '/config'); define('PUBLIC_PATH', BASE_PATH . '/public'); define('VIEWS_PATH', APP_PATH . '/views'); spl_autoload_register(function ($class) { $prefix = 'App\\'; $baseDir = APP_PATH . '/'; $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { return; } $relativeClass = substr($class, $len); $relativeClass = str_replace('\\', '/', $relativeClass); $relativeClass = str_replace('Core/', 'core/', $relativeClass); $relativeClass = str_replace('Controllers/', 'controllers/', $relativeClass); $relativeClass = str_replace('Models/', 'models/', $relativeClass); $relativeClass = str_replace('Helpers/', 'Helpers/', $relativeClass); $file = $baseDir . $relativeClass . '.php'; if (file_exists($file)) { require $file; } }); require_once CONFIG_PATH . '/app.php'; require_once CONFIG_PATH . '/database.php'; function view($name, $data = []) { $viewFile = VIEWS_PATH . '/' . $name . '.php'; if (!file_exists($viewFile)) { throw new \Exception("View not found: {$name}"); } extract($data); require $viewFile; } function redirect($path) { $allowedHost = $_SERVER['HTTP_HOST'] ?? ''; $parsed = parse_url($path); if (!empty($parsed['host']) && $parsed['host'] !== $allowedHost) { $path = '/'; } header('Location: ' . $path); exit; } function asset($path) { return '/assets/' . ltrim($path, '/'); } function old($key, $default = '') { return $_SESSION['_old_input'][$key] ?? $default; } function flash($key, $message = null) { if ($message !== null) { $_SESSION['_flash'][$key][] = $message; return; } $messages = $_SESSION['_flash'][$key] ?? []; unset($_SESSION['_flash'][$key]); return $messages; } function csrf_token() { if (empty($_SESSION['_csrf_token'])) { $_SESSION['_csrf_token'] = bin2hex(random_bytes(32)); } return $_SESSION['_csrf_token']; } function csrf_field() { return ''; } function e($value) { return htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); } function escapeUrl($url) { return filter_var($url, FILTER_VALIDATE_URL) ? htmlspecialchars($url) : ''; } Bootstrap Loaded