Zum Hauptinhalt springen

🔄 Request-Lebenszyklus

Jeder Request beginnt bei index.php

  1. Konstanten definieren (ROOT, APP, CONFIG)
  2. Helper-Funktionen laden
  3. Prüfen ob installiert (config/database.php vorhanden?)
  4. Falls nicht installiert → Weiterleitung zu /install/
  5. DB-Konfiguration + Helpers laden, Session starten
  6. Request-Pfad berechnen (handhabt Unterverzeichnis-Installationen)
  7. 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 $page und inkludiert layout.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