🔄 Request-Lebenszyklus
Jeder Request beginnt bei index.php
- Konstanten definieren (
ROOT,APP,CONFIG) - Helper-Funktionen laden
- Prüfen ob installiert (
config/database.phpvorhanden?) - Falls nicht installiert → Weiterleitung zu
/install/ - DB-Konfiguration + Helpers laden, Session starten
- Request-Pfad berechnen (handhabt Unterverzeichnis-Installationen)
- Dispatch über
app/router.php
Der Router
app/router.php ist eine flache Pattern-Matching-Dispatch-Tabelle. Muster werden zu Regex kompiliert und mit dem Request-Pfad verglichen. Capture-Gruppen werden als Controller-Methodenargumente übergeben.
Authentifizierung
Die meisten Controller rufen require_auth() auf, das nicht authentifizierte Benutzer zu /login weiterleitet. Admin-only-Endpoints verwenden require_admin(), das JSON 403 zurückgibt.
Sessions werden beim Login mit user_id, workspace_id, role befüllt und zur Verhinderung von Session-Fixation regeneriert.
Datenbankverbindung
Die PDO-Verbindung wird lazy bei der ersten Abfrage erstellt (Singleton). Verwendet ERRMODE_EXCEPTION und echte Prepared Statements (EMULATE_PREPARES = false).
Antwortformate
- HTML-Seiten: Controller setzt
$pageund inkludiertlayout.php - JSON-APIs:
json_response()setzt Content-Type, gibt JSON aus, beendet - SSE-Stream: Persistente Schleife mit
text/event-stream, Ping alle 2s, endet nach 55s