dbxapp – Einführung, Ablauf, Architektur, Stärken und Schwächen
Diese Dokumentation fasst die bisherigen Analysen so zusammen, dass ein neuer Programmierer dbxapp nicht nur benutzen, sondern auch korrekt verstehen, erweitern und vorsichtig optimieren kann.
Überblick
dbxapp ist ein PHP-Framework für Web- und Mobile-Anwendungen. Praktisch besteht es vor allem aus Reports, Formularen, Modulen, Templates und einem zentralen Runtime-/Session-System. Alles läuft grundsätzlich über index.php als einzigen Einstieg.
Das System ist darauf ausgelegt, Seiten serverseitig sehr schnell zu erzeugen. Nach den gemessenen Werten des Systemautors liegen typische komplette Requests meist bei etwa 0,01x s, das clientseitige core.js inklusive Libs oft bei etwa 0,02x s. Das passt zur Architektur: einfache Templates, viel Wiederverwendung, Session-Caches, keine schwere SPA-Laufzeit.
Grundprinzip von dbxapp
Grobe Systemstruktur
einziger Einstiegspunkt, setzt Runtime, Session, lädt Kernel und startet die App.
Kernel-Bootstrap und zentrale dbx()-API für Systemobjekte, State-Funktionen, Loader, Debug und projektweite myX-Overrides.
lädt/erzeugt DBX-Session, hält Benutzer- und Request-Zustand, kann Sessiondaten in DB schreiben.
prüft Request, Sprache, Remember, Permalink, Design, Modul und orchestriert die Hauptausführung.
verarbeitet -Includes rekursiv im erzeugten HTML.
lädt Templates, ersetzt Variablen, verarbeitet [inc] und [tpl], ergänzt optional Editor-Marker.
DB- und DD-Schicht. Nicht nur Query-Wrapper, sondern DD-gesteuerte Datenplattform.
zustandsvolle Anwendungs-Bausteine für Formulare und Listen/Reports.
clientseitige Infrastruktur: Loader, Feature-Registry, data-dbx-Scan, UI-State, Ajax, Gerätelogik, Observer.
Kern-API: dbx()
Der bevorzugte Zugriff auf den Systemkern erfolgt über dbx(). Die früher direkt genutzten globalen Helper wie dbx_get_SysVar(), dbx_get_PostGetVar() oder dbx_get_sys_object() wurden in die Klasse dbxApi überführt.
$db = dbx()->get_SysObj('dbxDB');
$tpl = dbx()->get_SysObj('dbxTPL');
$id = dbx()->req('id', 0, 'int');
dbx()->setSys('dbx_ajax', 1);
$ajax = dbx()->sys('dbx_ajax', 0, 'int');
dbx()->get_SysObj('dbxDB') lädt zuerst die Originalklasse aus dbx/include. Danach wird automatisch der projektweite Override aus dbx/modules/myX/sysclass bevorzugt. Aus dbxDB wird dadurch z.B. myDB extends dbxDB.
Individuelle Anpassungen liegen nicht mehr im Kernel, sondern in myX/sysclass. Fehlt eine myX-Klasse, wird sie beim ersten Zugriff automatisch erzeugt und kann danach erweitert werden.
dbx()->req(), dbx()->get() und dbx()->post() lesen Eingaben validiert. Beispiel: dbx()->req('page', 1, 'int') liefert nur einen gültigen Integer oder den Default.
sys() gilt global für den Request, mod() für die aktive Modulinstanz, rem() für länger gültigen Benutzer-/UI-Zustand und session() für strukturierten Sessionzustand.
Neue Kern- oder Modulprogrammierung soll den kurzen API-Stil verwenden. Das macht Suche, Refactoring und spätere Dokumentation einfacher: dbx()->cfg('dbx') beschreibt klarer, welche Ebene gemeint ist, als eine lange globale Funktionsliste.
Ablauf eines Requests
Output Buffering, Sessionstart, Basisfunktionen, Composer-Autoload, Kernel laden.
dbxWebApp, dbxSession, dbxInterpreter werden über dbx()->get_SysObj() geladen. Wenn passende myX-Overrides existieren, werden diese instanziert.
dbxSession->load_session() prüft Browser/IP/Host, erstellt bei Bedarf eine neue DBX-Session und erhöht Request-Zähler.
dbxWebApp->check_request() mischt GET, POST und JSON-Body, bestimmt base URL, base URI, self URL, permalink, Ajax-Flag, Window-Flag.
Mehrere Checks legen den Laufkontext fest.
dbxWebApp->run() prüft Zugriffsrechte, erzeugt Modulobjekt, setzt Master-/Aktiv-Kontext und ruft dessen run() auf.
Wenn nicht Ajax, wird ein Design-Template geladen und [dbx:content] ersetzt.
im erzeugten HTML werden nachträglich abgearbeitet.
Platzhalter aus dbx()->norep() werden in finalen Inhalt zurückgeschrieben.
letzte globale Textmanipulation möglich, dann Rückgabe nach index.php und Echo.
save_session() und clean_session().
Konkretes Beispiel: Admin-Session-Liste
?dbx_modul=dbxAdmin&dbx_run1=session&dbx_run2=list_session&dbx_edit=0
- check_request() übernimmt diese Parameter in den Laufkontext.
- check_perma() greift hier nicht um, weil Modul direkt angegeben ist.
- check_design() wählt das aktive Design, typischerweise Admin-Design bei Adminkontext.
- dbxWebApp->run() lädt Modul dbxAdmin.
- dbxAdmin->run() liest dbx_run1=session und lädt Include-Klasse dbxSession aus dem Modul dbxAdmin.
- Diese Modulklasse ruft bei dbx_run2=list_session den Reportaufbau auf.
- dbxReport_Session erweitert Systemklasse dbxReport.
- Der Report baut Formularfelder, Pagination, Tabellenkopf, Tabellenzeilen und Aktionslinks aus Templates zusammen.
- Die Daten kommen aus DD dbxSession und DB dbxSession.db3.
- Das komplette Ergebnis wird in das Design default.htm gesetzt.
- Danach lädt der Interpreter noch Menüs wie Menu (b-undef) not found.
Zustandsmodell: das eigentliche Rückgrat
dbxapp ist stark zustandsgetrieben. Wer das System verstehen will, muss die verschiedenen Speicherorte unterscheiden.
| Ebene | Bedeutung | Typische Nutzung |
|---|---|---|
| SysVar | globaler Laufkontext des aktuellen Requests | aktives Modul, Design, Ajax, URLs, Sprache |
| ModulVar | modul- und modulinstanzbezogener Kontext | dbx_run1, dbx_run2, RID, Include-Parameter |
| Remember | länger gültiger UI-/Benutzerzustand | Sprache, Design, Edit-Modus, Aktiv-IDs |
| SessionVal | strukturierter Modulspeicher | Formularzustand, Report-Selektion, View-Zustand |
| current_user | aktueller Benutzerkontext | Rollen, User-ID, Sprache, Farbe, Design |
Das ist einer der größten Unterschiede zu gängigen Frameworks: In dbxapp werden viele Dinge nicht als kurzlebiges Request-Objekt modelliert, sondern als strukturierter Session-/Kontextzustand.
Templates und Designsystem
Templates sind in dbxapp bewusst einfach. Keine Schleifen, keine Template-Sprache, kein Eval. Stattdessen:
- {var} für einfache Ersetzungen
- für einfache Bedingungen
- TPL (dbxContent/file.htm) not foundfür rekursive Template-Includes
- für spätere Interpreter-Komposition
Sehr wichtig ist die Trennung zwischen Modul-Templates und Design-Templates. Das Modul liefert den inhaltlichen Block, das Design liefert den Seitenskelett-Rahmen. Danach kommt der Interpreter und ergänzt weitere modulare Inhalte wie Menüs.
Module, Includes und Komposition
Ein Modul ist eine PHP-Klasse mit einer zentralen run()-Methode. Es kann:
- direkt Inhalte erzeugen,
- Unterklassen aus dem eigenen Include-Ordner laden,
- Templates rendern,
- weitere Module im HTML als einbetten.
Die Komposition ist deklarativ. Das ist einer der wichtigsten Architekturzüge von dbxapp. Ein Template oder Modul kann andere Modul-Ausgaben an beliebiger Stelle einbetten. Dadurch entsteht die Seite nicht in einem zentralen Controller, sondern schrittweise aus Bausteinen.
Wichtig: Kontext-Isolation pro Modulinstanz ist zentral. Genau deshalb existieren dbx_activ_modul_id und die modulinstanzbezogenen ModulVar-Speicher.
Data Dictionaries (DD)
Die DDs sind nicht nur Felddefinitionen. Sie sind ein zentrales Metamodell. In ihnen stehen:
Beispielhaft sieht man das an lkw.dd.php und dbxSession.dd.php. Dieselben DD-Daten beeinflussen Datenbankzugriff, Formularerzeugung, Reportspalten und Grid-Metadaten.
Formulare und Reports
dbxForm und dbxReport sind keine kleinen Helfer, sondern zentrale Laufzeitklassen.
- dbxForm verwaltet Felder, Validierung, Formularstatus, Meldungen, Reloads, Sessionzustand und Rendering.
- dbxReport erweitert das um Tabellen-/Listenlogik, Pagination, Selektionslogik, Row-Actions, Formatierungen und Seitenaufbau.
Damit entstehen große Teile einer Anwendung aus Konfiguration plus Templates plus etwas Steuerlogik in Modulklassen.
Der Report zur Session-Liste ist ein typisches Beispiel: Filterfelder, Pagination, Row-Delete, Mehrfachselektion und Tabellenkopf werden nicht individuell von Hand geschrieben, sondern über die Report-Infrastruktur erzeugt.
Frontend: core.js und Lib-System
Clientseitig ist dbxapp kein loser Haufen Skripte, sondern besitzt ein eigenes kleines Frontend-Framework:
- Namespace dbx
- Feature-Registry
- Asset-Loader für JS/CSS
- data-dbx-Parser
- Auto-Scan per MutationObserver
- UI-State in localStorage
- delegierte Events
- Geräte-/Loop-Abstraktion
Das bedeutet: Third-Party-Libs werden nicht roh benutzt, sondern hinter DBX-Features integriert. Das passt auch zu Grid/Tabulator und zum Ajax-System.
Stärken von dbxapp
- Sehr schnell: extrem kurze Request-Zeiten passen zur einfachen serverseitigen Architektur.
- Deterministisch: Seiten entstehen aus klaren Templates und Modulen, nicht aus versteckter Magie eines großen Framework-Stacks.
- Hohe Wiederverwendbarkeit: Form- und Report-Infrastruktur spart sehr viel Standardarbeit.
- Starke Komposition: Module können überall eingebettet werden.
- DD als gemeinsames Metamodell: Datenbank, Rechte, UI und Validierung hängen zusammen.
- Serverseitig robust: kein Zwang zu API-first oder SPA-Architektur.
- Frontend kontrolliert: eigenes Core-System statt unkoordiniertem Wildwuchs.
Schwächen und Risiken
- Hohe Einstiegshürde: ohne Verständnis von SysVar, ModulVar, Remember und SessionVal wirkt das System schnell verwirrend.
- Kern-API im Umbau: die wichtigsten früher globalen Zugriffe laufen jetzt über dbx(); verbleibende globale Hilfsfunktionen sollten bewusst klein gehalten werden.
- Session als zentrale Laufzeitbasis: praktisch, aber für neue Entwickler ungewohnt.
- Kontextwechsel im Interpreter: sehr mächtig, aber nur sauber beherrschbar, wenn Modulinstanz-Kontext exakt verstanden wird.
- Doppelte Namenswelten: gleiche Klassennamen als System- und Modulklasse können ohne Namespace-Verständnis irritieren.
- Dokumentationsbedarf: vieles ist logisch, aber nicht auf den ersten Blick selbsterklärend.
Vergleich mit gängigen Systemen
| Systemtyp | Typischer Fokus | dbxapp im Vergleich |
|---|---|---|
| Laravel / Symfony | klassisches modernes PHP-Framework, DI, Routing, Middleware, ORM, Services | dbxapp ist direkter, kontextnäher und template-/DD-zentrierter. Weniger standardisiert, aber oft leichter und schneller in seinem eigenen Muster. |
| WordPress | CMS, Hook-System, Plugin-Ökosystem | dbxapp ist viel stärker an Anwendungslogik, Reports und Formprozessen orientiert und architektonisch deutlich technischer. |
| Typische CRUD-Backends | Formulare, Tabellen, Adminseiten | dbxapp ist hier besonders stark, weil DD + Form + Report genau auf diesen Anwendungsstil zugeschnitten sind. |
| SPA-Stacks mit React/Vue | Clientseitige UI, API-first, Zustand im Browser | dbxapp verfolgt fast das Gegenteil: Server baut die Seite, Browser ergänzt Verhalten. Dafür ist es einfacher, schneller und robuster, wenn keine SPA nötig ist. |
| Low-Code/Admin-Generatoren | schnelle Standardmasken | dbxapp ist flexibler und tiefer kontrollierbar, aber verlangt mehr Systemverständnis. |
Fazit für neue Entwickler
Wer dbxapp richtig benutzen will, sollte das System nicht mit Standard-MVC-Mustern verwechseln. Der richtige Zugang ist:
- vom Ablauf aus denken – Request, Session, WebApp, Modul, Template, Interpreter, Ausgabe;
- vom Zustand aus denken – SysVar, ModulVar, Remember, SessionVal;
- vom DD aus denken – Daten, Rechte, UI, Validierung gehören zusammen;
- von Komposition aus denken – Seiten setzen sich aus Modulen und Templates zusammen.
Dann wird klar: dbxapp ist kein zufälliges Alt-System, sondern ein bewusst serverseitig, schnell und produktionsnah aufgebautes Framework mit eigenem Architekturprofil.