Co-authored-by: blaerf <blaerf@gmx.de> Reviewed-on: https://git.eckertplayground.de/taarly/PHP_AdminTool_Projekt/pulls/10
157 lines
4.6 KiB
PHP
157 lines
4.6 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'] ?? []);
|
|
// Standard: Wir gehen davon aus, dass es KEINE Loginseite ist,
|
|
// außer der Controller sagt explizit etwas anderes.
|
|
if (!array_key_exists('loginPage', $viewData)) {
|
|
$viewData['loginPage'] = false;
|
|
}
|
|
$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;
|
|
}
|
|
|
|
|