OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

bootstrap.php

2 KB
<?php

declare(strict_types=1);

/**
 * Eigenständiger PSR-4-Autoloader für den Anwendungs-Namespace OpenNIT\.
 *
 * Hintergrund: Der Updater überschreibt `vendor/` bewusst NICHT
 * (UpdateManager::PROTECTED_PATHS) und führt kein `composer dump-autoload`
 * aus. Hinge das Laden der App-Klassen allein an Composers generierter
 * PSR-4-Map, bliebe diese nach einem Update auf altem Stand stehen – eine
 * Namespace-Umbenennung (früher ITDocs\, jetzt OpenNIT\) würde
 * Bestandsinstanzen dann komplett lahmlegen, weil keine einzige App-Klasse
 * mehr gefunden wird.
 *
 * Dieser Autoloader macht das Laden von OpenNIT\* daher unabhängig von
 * `vendor/` und wird direkt aus jedem Einstiegspunkt (public/index.php,
 * bin/*.php) – unmittelbar nach `vendor/autoload.php` – geladen. Composer
 * bleibt für die Drittanbieter-Pakete zuständig.
 */

(static function (): void {
    $srcDir = __DIR__ . '/src/';

    // Primär: OpenNIT\Foo\Bar  ->  src/Foo/Bar.php
    spl_autoload_register(static function (string $class) use ($srcDir): void {
        $prefix = 'OpenNIT\\';
        $len = strlen($prefix);
        if (strncmp($class, $prefix, $len) !== 0) {
            return;
        }
        $relative = substr($class, $len);
        $file = $srcDir . str_replace('\\', '/', $relative) . '.php';
        if (is_file($file)) {
            require $file;
        }
    });

    // Übergang / Defense-in-Depth: Frühere ITDocs\-Referenzen, die nach dem
    // Rename noch irgendwo auftauchen könnten (z. B. in der DB gespeicherte
    // FQCNs vor der Migration, externe Integrationen, serialisierte Daten),
    // transparent auf den neuen OpenNIT\-Namespace umbiegen.
    spl_autoload_register(static function (string $class): void {
        $prefix = 'ITDocs\\';
        $len = strlen($prefix);
        if (strncmp($class, $prefix, $len) !== 0) {
            return;
        }
        $target = 'OpenNIT\\' . substr($class, $len);
        if (class_exists($target) || interface_exists($target) || trait_exists($target)) {
            class_alias($target, $class);
        }
    });
})();