PHP_AdminTool_Projekt/public/index.php
2025-11-28 15:34:38 +01:00

152 lines
4.4 KiB
PHP

<?php
// Strenge Typprüfung für Parameter- und Rückgabetypen aktivieren.
declare(strict_types=1);
// Eine neue Session wird gestartet und die entsprechende Variable ($_SESSION) angelegt oder eine bestehende wird fortgesetzt.
session_start();
/*
* Registriert eine Autoload-Funktion für Klassen mit dem Namespace-Präfix "App\".
* Statt jede Klasse manuell über "require pfad_zur_klasse.php" einzubinden,
* versucht PHP nun automatisch, die passende Datei zu laden, sobald eine Klasse
* im Namespace "App\..." verwendet wird.
*/
spl_autoload_register(
static function (string $class): void {
$prefix = 'App\\';
$baseDir = __DIR__ . '/../app/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
$relativeClass = substr($class, $len);
$file = $baseDir . str_replace('\\', DIRECTORY_SEPARATOR, $relativeClass) . '.php';
if (file_exists($file) === true) {
require $file;
}
}
);
require __DIR__ . '/views/layout.php';
// Pfad zur Konfigurationsdatei prüfen und Konfiguration laden
$configPath = __DIR__ . '/../config/config.php';
if (file_exists($configPath) === false) {
// Fail fast: ohne Konfiguration macht die App keinen Sinn
http_response_code(500);
echo 'Konfigurationsdatei config/config.php wurde nicht gefunden. '
. 'Bitte config.example.php kopieren und anpassen.';
exit;
}
/** @var array<string, mixed> $config */
$config = require $configPath;
use App\Controllers\AuthController;
use App\Controllers\DashboardController;
use App\Controllers\UserManagementController;
/**
* Hilfsfunktion: Prüft, ob ein Benutzer eingeloggt ist.
* Wenn nicht, wird auf die Login-Seite umgeleitet.
*
* @param array<string, mixed> $config
*/
function requireLogin(array $config): void
{
// session_key_user aus dem Config-Array lesen. Wenn nicht gesetzt oder null, Standard "admin_user" verwenden.
$sessionKey = $config['security']['session_key_user'] ?? 'admin_user';
// Prüfen, ob in $_SESSION unter diesem Key ein eingeloggter Benutzer hinterlegt ist.
// Falls nicht, zurück zur Login-Seite umleiten.
if (isset($_SESSION[$sessionKey]) === false) {
header('Location: index.php?route=login');
exit;
}
}
/**
* Verarbeitet ein View-Result oder Redirect-Result.
*
* @param array<string, mixed>|null $result
*/
function handleResult(?array $result): void
{
if ($result === null) {
return;
}
if (isset($result['redirect']) === true) {
header('Location: ' . (string)$result['redirect']);
exit;
}
$contentView = (string)($result['view'] ?? '');
$viewData = (array)($result['data'] ?? []);
$pageTitle = (string)($result['pageTitle'] ?? '');
$activeMenu = $result['activeMenu'] ?? null;
if ($contentView === '' || file_exists($contentView) === false) {
http_response_code(500);
echo 'Interner Fehler: Content-View wurde nicht gefunden.';
exit;
}
// Hier rufen wir jetzt die Layout-Funktion aus layout.php auf
renderLayout($contentView, $viewData, $pageTitle, is_string($activeMenu) ? $activeMenu : null);
}
// Controller instanziieren
$authController = new AuthController($config);
$dashboardController = new DashboardController($config);
$userManagementController = new UserManagementController($config);
// Route bestimmen
$route = $_GET['route'] ?? 'login';
switch ($route) {
case 'login':
// Login-Formular anzeigen (ggf. mit Fehlermeldung)
$result = $authController->showLoginForm();
handleResult($result);
break;
case 'login.submit':
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
// Falscher HTTP-Verb: einfach zurück zum Login
header('Location: index.php?route=login');
exit;
}
$result = $authController->processLogin();
handleResult($result);
break;
case 'logout':
$result = $authController->logout();
handleResult($result);
break;
case 'dashboard':
requireLogin($config);
$result = $dashboardController->show();
handleResult($result);
break;
case 'users':
requireLogin($config);
$result = $userManagementController->show();
handleResult($result);
break;
default:
http_response_code(404);
echo 'Route nicht gefunden.';
break;
}