dbxapp Wissen Technische Systemdokumentation

Technische Systemdokumentation

Entwickler-Dokumentation

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.

single entry point session-/kontextgesteuert template-zentriert dictionary-driven kompositionsbasiert
Wichtiger Grundsatz
dbxapp ist kein klassisches MVC-Framework, kein SPA-System und kein ORM-zentriertes System. Es ist ein stark serverseitiges, zustandsgetriebenes, template- und modulorientiertes Anwendungssystem.
1

Ü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.

2

Grundprinzip von dbxapp

Server first: HTML wird primär auf dem Server aufgebaut. JavaScript ergänzt Verhalten, ersetzt aber nicht die Grundarchitektur.
Kontext statt Request-Objekte: Das System arbeitet stark über Session, SysVar, ModulVar, Remember und SessionVal.
Templates statt HTML-Generierung: PHP steuert Logik, Templates liefern Struktur.
Dictionary driven: Data Dictionaries definieren Daten, Rechte, Typen, Defaults und auch UI-Verhalten.
3

Grobe Systemstruktur

index.php
einziger Einstiegspunkt, setzt Runtime, Session, lädt Kernel und startet die App.
dbxKernel.php / dbxApi.php
Kernel-Bootstrap und zentrale dbx()-API für Systemobjekte, State-Funktionen, Loader, Debug und projektweite myX-Overrides.
dbxSession
lädt/erzeugt DBX-Session, hält Benutzer- und Request-Zustand, kann Sessiondaten in DB schreiben.
dbxWebApp
prüft Request, Sprache, Remember, Permalink, Design, Modul und orchestriert die Hauptausführung.
dbxInterpreter
verarbeitet -Includes rekursiv im erzeugten HTML.
dbxTPL
lädt Templates, ersetzt Variablen, verarbeitet [inc] und [tpl], ergänzt optional Editor-Marker.
dbxDB
DB- und DD-Schicht. Nicht nur Query-Wrapper, sondern DD-gesteuerte Datenplattform.
dbxForm / dbxReport
zustandsvolle Anwendungs-Bausteine für Formulare und Listen/Reports.
core.js + Libs
clientseitige Infrastruktur: Loader, Feature-Registry, data-dbx-Scan, UI-State, Ajax, Gerätelogik, Observer.
4

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');
Systemobjekte:
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.
Auswirkung:
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.
Requestwerte:
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.
Kontextwerte:
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.

5

Ablauf eines Requests

1. PHP-Start in index.php
Output Buffering, Sessionstart, Basisfunktionen, Composer-Autoload, Kernel laden.
2. Systemobjekte holen
dbxWebApp, dbxSession, dbxInterpreter werden über dbx()->get_SysObj() geladen. Wenn passende myX-Overrides existieren, werden diese instanziert.
3. Session laden
dbxSession->load_session() prüft Browser/IP/Host, erstellt bei Bedarf eine neue DBX-Session und erhöht Request-Zähler.
4. Request normalisieren
dbxWebApp->check_request() mischt GET, POST und JSON-Body, bestimmt base URL, base URI, self URL, permalink, Ajax-Flag, Window-Flag.
5. Remember / Sprache / Permalink / Konfiguration / Design / Modul
Mehrere Checks legen den Laufkontext fest.
6. Master-Modul ausführen
dbxWebApp->run() prüft Zugriffsrechte, erzeugt Modulobjekt, setzt Master-/Aktiv-Kontext und ruft dessen run() auf.
7. Modulinhalt in Design einbetten
Wenn nicht Ajax, wird ein Design-Template geladen und [dbx:content] ersetzt.
8. Interpreter-Lauf
im erzeugten HTML werden nachträglich abgearbeitet.
9. norep-Auflösung
Platzhalter aus dbx()->norep() werden in finalen Inhalt zurückgeschrieben.
10. out_filter + Ausgabe
letzte globale Textmanipulation möglich, dann Rückgabe nach index.php und Echo.
11. Session sichern / aufräumen
save_session() und clean_session().
6

Konkretes Beispiel: Admin-Session-Liste

?dbx_modul=dbxAdmin&dbx_run1=session&dbx_run2=list_session&dbx_edit=0

  1. check_request() übernimmt diese Parameter in den Laufkontext.
  2. check_perma() greift hier nicht um, weil Modul direkt angegeben ist.
  3. check_design() wählt das aktive Design, typischerweise Admin-Design bei Adminkontext.
  4. dbxWebApp->run() lädt Modul dbxAdmin.
  5. dbxAdmin->run() liest dbx_run1=session und lädt Include-Klasse dbxSession aus dem Modul dbxAdmin.
  6. Diese Modulklasse ruft bei dbx_run2=list_session den Reportaufbau auf.
  7. dbxReport_Session erweitert Systemklasse dbxReport.
  8. Der Report baut Formularfelder, Pagination, Tabellenkopf, Tabellenzeilen und Aktionslinks aus Templates zusammen.
  9. Die Daten kommen aus DD dbxSession und DB dbxSession.db3.
  10. Das komplette Ergebnis wird in das Design default.htm gesetzt.
  11. Danach lädt der Interpreter noch Menüs wie Menu (b-undef) not found.
Wichtiger Architekturpunkt: Es gibt im System dieselbe Klassenbezeichnung teils doppelt, einmal als Systemklasse und einmal als Modulklasse. Durch Namespace bleiben sie getrennt. Genau das ist hier beim Namen dbxSession relevant.
7

Zustandsmodell: das eigentliche Rückgrat

dbxapp ist stark zustandsgetrieben. Wer das System verstehen will, muss die verschiedenen Speicherorte unterscheiden.

EbeneBedeutungTypische Nutzung
SysVarglobaler Laufkontext des aktuellen Requestsaktives Modul, Design, Ajax, URLs, Sprache
ModulVarmodul- und modulinstanzbezogener Kontextdbx_run1, dbx_run2, RID, Include-Parameter
Rememberlänger gültiger UI-/BenutzerzustandSprache, Design, Edit-Modus, Aktiv-IDs
SessionValstrukturierter ModulspeicherFormularzustand, Report-Selektion, View-Zustand
current_useraktueller BenutzerkontextRollen, 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.

8

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 found
    fü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.

Zusätzliche Erkenntnis: Modul-Templates kommen vom Modul selbst, und auch die aufgerufenen URLs/Actions können dynamisch vom Modul gesetzt werden. Das System ist also nicht statisch auf feste Endpunkte verdrahtet.
9

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.

10

Data Dictionaries (DD)

Die DDs sind nicht nur Felddefinitionen. Sie sind ein zentrales Metamodell. In ihnen stehen:

Tabelle Server Zugriffsrechte Owner-Rechte Feldtypen Defaults Regeln Labels Gruppen Protect-Flags UI-Metadaten

Beispielhaft sieht man das an lkw.dd.php und dbxSession.dd.php. Dieselben DD-Daten beeinflussen Datenbankzugriff, Formularerzeugung, Reportspalten und Grid-Metadaten.

Deshalb ist dbxapp eher dictionary-driven als ORM-driven. Das DD ist der gemeinsame Wahrheitsanker zwischen Daten, Validierung und UI.
11

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.

12

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.

Design- und Komponentensicht: HTML kommt serverseitig, Verhalten wird clientseitig über data-dbx aktiviert. Dadurch bleiben Templates klar, und JavaScript wird kontextbezogen initialisiert.
13

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.
14

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.
15

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.
Besondere Stärke von dbxapp: Für datengetriebene Business-Anwendungen mit Reports, Formularen, Rollen, Tabellen und individuellen Workflows ist der Architekturansatz sehr passend. Die gemessenen Laufzeiten zeigen, dass das System genau in diesem Feld sehr effizient ist.
16

Fazit für neue Entwickler

Wer dbxapp richtig benutzen will, sollte das System nicht mit Standard-MVC-Mustern verwechseln. Der richtige Zugang ist:

  1. vom Ablauf aus denken – Request, Session, WebApp, Modul, Template, Interpreter, Ausgabe;
  2. vom Zustand aus denken – SysVar, ModulVar, Remember, SessionVal;
  3. vom DD aus denken – Daten, Rechte, UI, Validierung gehören zusammen;
  4. 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.