Het Multiminded Framework
in de schijnwerpers
Een eigen PHP 8.4 framework, opvolger van de gegroeide library/. Expliciet, immutable, testbaar — geen god-objects, geen magic.
Onderdelen van het framework
Html\El
StabielFluent, chainable HTML-builder met classList, style, DOM-traversal. Escaping ingebakken.
App\Router + Kernel
StabielRegex-router met ServerRequest. Kernel met DI-container, virtual readonly properties.
Form\* + DateField
StabielFormFactory + Validators + Conditional. Nieuw: DateField/DateRangeField met i18n-driven calendar.
Db\TableRepository
NieuwCRUD voor "normale" tabellen + fluent Query (where/in/like/null/between, nest/unnest, paginate). Events via PSR-14.
Dynamic\DynamicQuery
StabielImmutable fluent reader voor DynamicItems via metadata.cache.values.{lang}.* — geen EAV-joins.
CRUD voor DynamicItems: create/update/setActive/delete + auto cache-warm. Cascading delete via parent_id.
Drie EAV-strategieën (Subselect / LeftJoin / Pivot) voor benchen tegen het cache-pad.
Pure cache-logica. Skip-list (PASSWORD/USER/FILE/DYNAMIC_FORM/encrypted). Herbruikbaar buiten dit project.
Dynamic\DynamicStructure
StabielTypes-registry, file-cached, inheritance via metadata.extends.
Drie heldere lagen — Request beschrijft, Transport voert uit, Response komt terug. CachingTransport als decorator.
Front-end modules
Nieuwattach.js (positioner), custom-select.js (select-vervanger), date-picker.js (calendar), i18n.js (nl/en/de/fr).
Dev-tools
public/scratch.php— open in PHPStorm, schrijf code, refresh in browser./bin/repl— PsySH-shell met framework gebooted;$pdo,$kernelklaar- /bench.php — vergelijk cache vs. EAV-strategieën op live MariaDB
- /reference — Reflection-driven API-overzicht (auto-update bij elke nieuwe class)
Hoe het werkt
- bootstrap.php doet Composer-autoload + boot
Framework\App\Kernel - public/index.php registreert routes op
$kernel->router - De Router matcht de URI op een patroon en roept de bijbehorende callable
- De callable bouwt HTML via Html\El en geeft een string terug
- Layout wikkelt de content in de volledige HTML-pagina