Docker Compose mit drei Services (nginx auf Port 8000), Migrationsmechanik, Update- und Backup-Skript. Anwendung: Router mit CSRF-Prüfung, Anmeldung und Ersteinrichtung, zentraler Einstellungsdialog mit Reitern, ein- und ausschaltbares Debug-Log mit Maskierung von Zugangsdaten. Layout nach Vorbild des FinanzManagers: feste Navigation links, Werkzeugleiste oben, Tab-Leiste; Farbschema hell/dunkel/System. Tests: 51 PHP-Prüfungen und 7 Playwright-Tests, alle grün.
66 lines
2.2 KiB
PHP
66 lines
2.2 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
/**
|
||
* Front-Controller. nginx leitet jeden Request hierher.
|
||
*/
|
||
|
||
require dirname(__DIR__) . '/vendor/autoload.php';
|
||
|
||
use Finanzmanager\Auth;
|
||
use Finanzmanager\Config;
|
||
use Finanzmanager\Controllers\CockpitController;
|
||
use Finanzmanager\Controllers\EinstellungenController;
|
||
use Finanzmanager\Controllers\LoginController;
|
||
use Finanzmanager\Controllers\PlatzhalterController;
|
||
use Finanzmanager\Models\Einstellung;
|
||
use Finanzmanager\Router;
|
||
use Finanzmanager\Services\DebugLog;
|
||
use Finanzmanager\View;
|
||
|
||
Config::load();
|
||
|
||
// Die Einstellung aus der Datenbank hat Vorrang vor dem Env-Schalter – sie ist
|
||
// der Weg, den der Nutzer im Dialog bedient. Schlägt der Zugriff fehl, bleibt
|
||
// es beim Env-Wert; das Log soll gerade dann funktionieren, wenn die Datenbank
|
||
// das Problem ist.
|
||
try {
|
||
DebugLog::setAktiv(
|
||
Einstellung::getBool('debug_log_aktiv', (bool)Config::get('debug_log', false))
|
||
);
|
||
} catch (\Throwable) {
|
||
// Datenbank noch nicht bereit – Env-Schalter gilt weiter.
|
||
}
|
||
|
||
// Session vor dem Request-Log starten, sonst stünde dort nie ein Benutzer.
|
||
Auth::startSession();
|
||
DebugLog::request();
|
||
|
||
$router = new Router();
|
||
|
||
$router->get('/login', fn() => (new LoginController())->formular());
|
||
$router->post('/login', fn() => (new LoginController())->anmelden());
|
||
$router->post('/logout', fn() => (new LoginController())->abmelden());
|
||
|
||
$router->get('/einrichtung', fn() => (new LoginController())->einrichtungFormular());
|
||
$router->post('/einrichtung', fn() => (new LoginController())->einrichtungSpeichern());
|
||
|
||
$router->get('/', fn() => (new CockpitController())->index());
|
||
|
||
$router->get('/einstellungen', fn() => (new EinstellungenController())->index());
|
||
$router->post('/einstellungen', fn() => (new EinstellungenController())->speichern());
|
||
$router->post('/einstellungen/log-leeren', fn() => (new EinstellungenController())->logLeeren());
|
||
|
||
// Noch nicht gebaute Bereiche: sichtbar in der Navigation, mit Hinweis auf die Phase.
|
||
foreach (PlatzhalterController::pfade() as $bereich) {
|
||
$router->get('/' . $bereich, fn() => (new PlatzhalterController())->zeige($bereich));
|
||
}
|
||
|
||
try {
|
||
$router->dispatch();
|
||
} catch (\Throwable $e) {
|
||
DebugLog::fehler($e);
|
||
http_response_code(500);
|
||
(new View())->render('layout/500.php', []);
|
||
}
|