DynamicStructure

load() doet 2 queries (types + alle velden). loadCached() serialiseert naar disk per cacheKey, zodat meerdere sites elkaar niet overschrijven.

load() — 2 queries, daarna O(1) lookups

PDO is alleen tijdens load() nodig. De resulterende structure heeft geen DB-state meer.

$structure = DynamicStructure::load($pdo);

return [
    'aantal types' => count($structure->all()),
    'eerste 5'     => array_slice(
        array_map(fn($t) => $t->name, $structure->all()),
        0, 5,
    ),
];
Array
(
    [aantal types] => 433
    [eerste 5] => Array
        (
            [0] => base_layer
            [1] => styles
            [2] => page
            [3] => interface_carousel
            [4] => form_availability_date
        )

)

metadata.extends — eigen velden overschrijven geërfde

Als een type metadata.extends heeft, krijgt fieldsForType() ook de geërfde velden. Eigen velden hebben voorrang.

$structure = DynamicStructure::loadCached($pdo, cacheKey: $cacheKey);

// Pak een type met metadata.extends om inheritance te zien:
$found = null;
foreach ($structure->all() as $type) {
    if (!empty($type->metadata['extends'])) {
        $found = $type;
        break;
    }
}

return $found
    ? ['type' => $found->name . ' (id=' . $found->id . ')', 'velden' => array_keys($structure->fieldsForType($found->id))]
    : 'geen type met extends gevonden';
Array
(
    [type] => page (id=3)
    [velden] => Array
        (
            [0] => title
            [1] => logo
            [2] => theme_color_1
        )

)

loadCached — file-cache met unieke key per bron

Tweede call leest serialize(self) van disk; PDO wordt dan niet meer aangesproken. Cache-bestand: data/cache/structures/{key}.dat

$structure = DynamicStructure::loadCached(
    $pdo,
    cacheKey: $cacheKey,    // uniek per database
    ttl: 3600,              // null = oneindig
);

return ['types' => count($structure->all()), 'cacheKey' => $cacheKey];
Array
(
    [types] => 433
    [cacheKey] => demo.nl
)

invalidate — cache-file weggooien

Statisch — geen instance nodig. Volgende loadCached() hit dan altijd de DB.

DynamicStructure::invalidate('site-easyhandling');
void — verwijdert het bestand als het bestaat. Niet aangeroepen in deze demo.