wake-up-neo.net

Composer Classmap Autoload lädt keine neuen Dateien in den Ordner

Folgendes Problem: Ich habe in meiner composer.json eine Classmap definiert:

"autoload": {
    "classmap": [
        "app/controllers",
        "app/models",
        "app/helper.php"
    ]   
}

Wenn ich jedoch eine neue Datei im Ordner "Controller" oder "Models" erstelle, werden diese nicht geladen, und ich muss immer einen Composer Dump-Autoload erstellen.

Ist das das richtige Verhalten? Ich dachte, der Autoloader von Composer überwacht dann den Ordner auf neue Dateien?

18
pyxl

Ja, das ist korrektes Verhalten. Wenn Sie möchten, dass neue Klassen automatisch geladen werden, müssen Sie entweder das automatische Laden von PSR-0 oder PSR-4 verwenden.

Zum Erstellen der Classmap muss Composer den Dateinamen kennen, der eine bestimmte Klasse enthält. Dies ist nur möglich, wenn der gesamte Quellcode im Verzeichnis analysiert und nach Klassen, Schnittstellen und Merkmalsdefinitionen durchsucht wird.

Dies ist in der Regel eine CPU- und E/A-intensive Aufgabe. Daher wird dies nur durchgeführt, wenn Composer den Autoloader installiert/aktualisiert oder (bei Bedarf) den Autoloader erstellt. Dies wird nicht mit jedem require "vendor/autoload.php"; durchgeführt.

Beachten Sie, dass das Classmap-Autoloading einfach für alte Codebases vorhanden ist, die nicht mindestens PSR-0 implementiert haben. Es ist nicht für neuen Code gedacht - es sei denn, Sie möchten den Preis bezahlen, um den Autoloader während der Entwicklung immer wieder zu entleeren.

20
Sven

Wechseln Sie über SSH zum Stammverzeichnis Ihres Servers. Nun mache folgendes:

  1. Führen Sie ls aus, um alle Dateien aufzulisten.
  2. Sie sehen composer.lock Datei; Entfernen Sie die Datei mit dem Befehl rm composer.lock.
  3. Führen Sie jetzt den Befehl php composer update aus. 

Abhängig von Ihrem Linux-Typ müssen Sie möglicherweise php-cli composer update ausführen.

In Schritt 3 wird eine neue composer.lock-Datei erstellt, und alle Ihre Klassen werden erneut geladen. Tun Sie dies immer, wenn Sie neue Klassen hinzufügen.

oder:

  1. Führen Sie den Befehl composer dump-autoload aus.
6

Wie bereits erwähnt, ist dies korrektes Verhalten. Wenn Sie möchten, dass neue Klassen automatisch geladen werden, müssen Sie entweder das automatische Laden von PSR-0 oder PSR-4 verwenden.

Der angegebene autoload-Typ von classmap ist composer.json wird hauptsächlich von älteren Projekten verwendet, die nicht auf PSR-0 oder PSR-4 folgen. Ich habe vor kurzem mit der Arbeit an einem solchen Projekt begonnen und wollte versuchen, den Befehl composer dump-autoload automatisch auszuführen, wenn eine neue Klasse erstellt wird. Dies ist eigentlich schwierig, ohne die gesamte Composer-Quelle in das Projekt aufzunehmen. Ich habe das nur gemacht, um den Entwickler daran zu erinnern, dass er die Klassenkarte ausgeben muss:

$loader = include_once 'vendor/autoload.php';
if ( ! $loader ) {
    throw new Exception( 'vendor/autoload.php missing please run `composer install`' );
}

spl_autoload_register(
    function ( $class ) {
        if ( 'A_Common_Class_Prefix' === substr( $class, 0, 10 ) ) {
            throw new Error( 'Class "' . $class . '"" not found please run `composer dump-autoload`' );
        }
    },
    true
);

Dadurch wird ein anderer Autoloader registriert, der nach dem Autoloader des Composers ausgeführt wird, sodass alle Klassen, die der Composer nicht gefunden hat, an ihn übergeben werden. Wenn die Klasse mit einem Präfix übereinstimmt, wird eine Ausnahme ausgelöst, die den Entwickler daran erinnert, den Autoloader erneut zu sichern und die Klassenzuordnung zu aktualisieren.

0
David Stone