Warum muss ich den Befehl "composer dump-autoload" ausführen, damit Migrationen in Laravel funktionieren?

79

Ich habe in meiner Anwendung einige Migrationsklassen erstellt, um die benötigten Tabellen zu erstellen, erhalte jedoch weiterhin Fehler. Ich muss diesen Befehl ausführen:

composer dump-autoload

Nur dann funktioniert es wieder wie erwartet. Mache ich etwas falsch, das diesen Fehler erzeugt, oder ist dies ein normales Verhalten bei Migrationen?

Unten ist der Fehler, den ich beim Ausführen des Migrationsprozesses erhalte:

  [Symfony\Component\Debug\Exception\FatalErrorException]  
  Class 'CreateVideoStatusTable' not found  
Hasan Al-Natour
quelle
Verwenden Sie Phpartisan für Migrationen?
Duenna
Ja, ich benutze es, um die Erstellungs-Tabelle zu generieren und die Migration auszuführen
Hasan Al-Natour
Haben Sie Illuminate \ Database \ Schema \ Blueprint verwendet? Verwenden Sie Illuminate \ Database \ Migrations \ Migration. in Ihrer Datei und erweitern die Migrationsklasse?
Duenna
Ja, verwenden Sie "Illuminate \ Database \ Schema \ Blueprint verwenden" und "Illuminate \ Database \ Migrations \ Migration verwenden".
Hasan Al-Natour
Wenn ich Migrationsdateien erstelle, sehen sie normalerweise ähnlich aus wie codeshare.io/3iRxd. Sehen Sie nach, ob Ihre einem ähnlichen Muster folgen. Wenn Sie dies nicht tun, müssen Sie sicherstellen, dass Sie die Migrationsklasse erweitern. sieht alles ok aus
Duenna

Antworten:

92

OK, ich glaube, ich kenne das Problem, das Sie haben.

Da Composer die von Ihnen erstellten Migrationsdateien nicht sehen kann, müssen Sie den Befehl dump-autoload ausführen, der nichts Neues herunterlädt, sondern nach allen Klassen sucht, die erneut enthalten sein müssen. Es wird lediglich die Liste aller Klassen neu generiert, die in das Projekt aufgenommen werden müssen (autoload_classmap.php). Aus diesem Grund funktioniert Ihre Migration, nachdem Sie diesen Befehl ausgeführt haben.

So beheben Sie das Problem (möglicherweise) Sie müssen Ihrer Datei composer.json einige zusätzliche Informationen hinzufügen.

"autoload": {
    "classmap": [
        "PATH TO YOUR MIGRATIONS FOLDER"
    ],
}

Sie müssen den Pfad zu Ihrem Migrationsordner zum Classmap-Array hinzufügen. Führen Sie dann die folgenden drei Befehle aus ...

php artisan clear-compiled 
composer dump-autoload
php artisan optimize

Dadurch werden die aktuell kompilierten Dateien gelöscht, die benötigten Klassen aktualisiert und anschließend wieder ausgeschrieben, sodass Sie sie nicht erneut ausführen müssen.

Idealerweise führen Sie diese aus composer dump-autoload -o, um das Laden Ihrer Webseiten zu beschleunigen. Der einzige Grund, warum dies nicht die Standardeinstellung ist, liegt darin, dass die Generierung etwas länger dauert (aber nur geringfügig auffällt).

Ich hoffe, Sie können es schaffen, dies zu sortieren, da es in der Tat sehr ärgerlich ist :(

Duenna
quelle
5
Ich verstehe nicht, warum Laravel nicht damit umgegangen ist, es ist ein großartiger Rahmen.
Hasan Al-Natour
Ich habe bereits meine composer.json-Datei mit folgendem Inhalt: "autoload": {"classmap": ["database"], "psr-4": {"App \\": "app /"}},
Hasan Al- Natour
Wie soll ich den Pfad hinzufügen?
Hasan Al-Natour
Ich hatte einen Fehler beim Ausführen von "PHP Artisan Dump-Autoload": [InvalidArgumentException] Befehl "Dump-Autoload" ist nicht definiert.
Hasan Al-Natour
4
Entschuldigung, Sie müssen Komponisten verwenden, nicht PHP-Handwerker. Also sein Komponist Dump-Autoload
Duenna
2

Du solltest rennen:

composer dump-autoload

und wenn es nicht funktioniert sollten Sie:

re-install composer
afshindadashnezhad
quelle
2

Kurze Antwort: Klassenzuordnungen sind statisch, während das automatische Laden von PSR dynamisch ist.

Wenn Sie keine Klassenzuordnungen verwenden möchten, verwenden Sie stattdessen das automatische Laden von PSR.

Daniel W.
quelle