ServiceProvider, VendorPublishCommand und Migrator aus Laravel 13. Als Referenz für die Framework-Implementierung dient v13.34.0.
Kopieren und übergeben oder aus dem Paket laden?
publishesMigrations() registriert lediglich Quelle und Ziel als Veröffentlichungsziel. Beim Booten des Providers werden weder Dateien kopiert noch SQL-Anweisungen ausgeführt.
loadMigrationsFrom() hingegen registriert einen Suchpfad beim Migrator. Ein normales migrate berücksichtigt dann auch die Dateien in diesem Pfad, doch allein durch das Booten des Providers wird nichts ausgeführt.
Sollen Nutzer Tabellennamen oder Spalten vor dem Ausführen anpassen können, kommt das Veröffentlichen infrage. Verwaltet das Paket das Schema selbst und ist keine Bearbeitung der Dateien durch die Nutzer vorgesehen, können Sie auch das direkte Laden in Betracht ziehen. Die beiden folgenden Provider-Beispiele sind Alternativen zueinander.
Das Veröffentlichen implementieren
Vergeben Sie einen paketspezifischen Tag, damit Nutzer die Migrationen getrennt von anderen Ressourcen veröffentlichen können.Die Änderung des Zeitstempels hängt von der Konfiguration ab
Die offizielle Dokumentation beschreibt, dass der Zeitstempel einer Migration beim Veröffentlichen auf das aktuelle Datum und die aktuelle Uhrzeit gesetzt wird. Die Implementierung vonServiceProvider::publishesMigrations() fügt die Quelle jedoch nur dann den Kandidaten für die Zeitstempelaktualisierung hinzu, wenn database.migrations.update_date_on_publish aktiviert ist. Der Fallback beim Auslesen dieser Einstellung ist false.
Die config/database.php der Standardanwendung von Laravel 13 enthält die folgende Einstellung. Bei Anwendungen, die eine ältere Struktur übernommen haben, prüfen Sie auch, ob die Einstellung überhaupt vorhanden ist.
VendorPublishCommand das Datum nur um, wenn der reale Pfad mit einer registrierten Quelle übereinstimmt und der Zielname das Format YYYY_MM_DD_HHMMSS_ enthält. Ausgehend vom Startzeitpunkt des Befehls wird für jede betroffene Datei eine Sekunde addiert. Fehlt dieses Format im Namen, fügt dieser Vorgang kein Datum hinzu.
Die Zeitstempelaktualisierung hängt sowohl von der Registrierung im Paket als auch von der Konfiguration der nutzenden Anwendung ab. Ändern Sie diese Einstellung nicht pauschal aus dem Provider des Pakets heraus, sondern dokumentieren Sie die Voraussetzung in der Installationsanleitung. Wird ein Konfigurations-Cache verwendet, muss dieser nach der Änderung zusätzlich neu erstellt werden.
Erneutes Veröffentlichen heißt nicht „nur nicht ausgeführte hinzufügen“
vendor:publish prüft den Ausführungsverlauf in der Datenbank nicht. Zudem prüft der Kopiervorgang in v13.34.0 die Existenz vorhandener Dateien anhand des Ziels vor der Änderung des Zeitstempels. Auch beim Veröffentlichen eines Verzeichnisses wird zuerst geprüft, ob im Ziel derselbe relative Pfad wie in der Quelle existiert, und erst danach wird das Datum umgeschrieben.
Wurde das Datum also beim ersten Veröffentlichen geändert und gibt es in der Anwendung keine Datei mit demselben Namen wie in der Quelle, kann ein erneutes Veröffentlichen desselben Tags eine weitere Datei mit anderem Datum hinzufügen. Gehen Sie nicht davon aus, dass Duplikate immer vermieden werden, solange Sie --force nicht angeben.
Ob eine Migration ausgeführt wurde, wird am Dateinamen entschieden
Migrator::getMigrationName() gibt den Basisnamen der Datei ohne .php zurück. Bei der Prüfung auf nicht ausgeführte Migrationen wird dieser Name mit dem Ausführungsverlauf verglichen. Es wird nicht geprüft, ob der PHP-Inhalt oder der Tabellenname übereinstimmt.
Das direkte Laden implementieren
Wenn die Migrationen im Paket unverändert ausgeführt werden sollen, registrieren Sie einen Suchpfad. Bei diesem Ansatz fügen Sie keine Veröffentlichung derselben Dateien hinzu.loadMigrationsFrom() ruft path() auf, sobald der Migrator aufgelöst wird. Migrator::path() entfernt doppelte Suchpfade, und getMigrationFiles() indiziert die gefundenen Dateien nach Migrationsnamen und sortiert sie in dieser Namensreihenfolge.
Aktualisieren Nutzer das Paket, werden neue Dateien beim nächsten migrate berücksichtigt. Benennen Sie vorhandene Dateien nicht um, sondern fügen Sie für neue Schemaänderungen neue Dateien hinzu. Um Konflikte mit anderen Paketen zu vermeiden, nehmen Sie auch den Funktionsnamen auf, etwa create_courier_deliveries_table. Dateien mit gleichem Namen erhalten denselben Schlüssel und werden nicht beide unabhängig voneinander ausgeführt.
Schemaänderungen an bestehende Nutzer ausliefern
Wenn Sie beispielsweise der Liefertabelle eine Sendungsnummer hinzufügen, bearbeiten Sie nicht die bereits veröffentlichtecreate_courier_deliveries_table, sondern fügen eine neue Datei für die Änderung hinzu. Wenn Sie die bestehende Erstellungsmigration bearbeiten, wird die Änderung bei Nutzern, die sie bereits ausgeführt haben, nicht ausgeführt.
database/migrations/2026_10_02_000000_add_tracking_code_to_courier_deliveries_table.php
Vor dem Release prüfen
Prüfen Sie zusätzlich zu den Datenbanktests des Pakets die Abläufe für Veröffentlichung und Update in einer nutzenden Anwendung. Wenn Sie in Tests die Migrationen nur direkt laden, haben Sie das Veröffentlichen, bei dem sich Dateinamen ändern, nicht überprüft.- Bei einer Erstinstallation auf einer leeren Datenbank lassen sich die benötigten Tabellen erstellen.
- Bei einem Update ausgehend von Datenbank und Ausführungsverlauf eines älteren Releases werden nur die neuen Änderungen angewendet.
- Die Dateiliste nach wiederholtem Ausführen desselben Veröffentlichungsbefehls ist geprüft, und der Update-Ablauf erzeugt keine Duplikate.
- Der Ablauf berücksichtigt aktivierte und deaktivierte Datumsaktualisierung sowie Änderungen an bereits veröffentlichten Dateien.
- Das Rollback neuer Migrationen und die Ausführungsreihenfolge im Verhältnis zu den anderen Migrationen der Anwendung sind geprüft.
Verwandte Seiten
Migrationen
Grundlagen zu Schemadefinition, Ausführungsverlauf und Rollback.
Pakete testen
Service Provider und Datenbank eines Pakets testen.
Zusammenführen und Cachen von Paketkonfigurationen
Update-Abläufe unter Berücksichtigung der Nutzerkonfiguration und des Konfigurations-Caches.
Verwaltung der Versionskompatibilität
Update-Abläufe und Kompatibilitätsänderungen mit der Release-Strategie verknüpfen.
Verwendete Primärquellen
- Offizielle Laravel-Dokumentation: Paket-Migrationen
- ServiceProvider: Registrierung von Veröffentlichungszielen und Suchpfaden
- VendorPublishCommand: Kopieren und Ändern von Zeitstempeln
- Migrator: Erkennen von Dateien und Prüfung auf nicht ausgeführte Migrationen
- Standardanwendung von Laravel 13: Datenbankkonfiguration