ServiceProvider, VendorPublishCommand en Migrator in Laravel 13. Voor de implementatie van het framework is v13.34.0 als referentie gebruikt.
Kopiëren en overdragen, of laden vanuit het package?
publishesMigrations() registreert alleen de bron en de bestemming als te publiceren items. Het booten van de provider kopieert geen bestanden en voert geen SQL uit.
loadMigrationsFrom() registreert daarentegen een zoekpad bij de Migrator. Een gewone migrate neemt dan ook de bestanden in dat pad mee, maar alleen het booten van de provider voert ze niet uit.
Als gebruikers vóór het uitvoeren tabelnamen of kolommen moeten kunnen aanpassen, ligt de publicatiemethode voor de hand. Beheert het package het schema zelf en verwacht je niet dat gebruikers de bestanden bewerken, dan kun je ook de methode met direct laden overwegen. De twee providervoorbeelden hieronder zijn alternatieven voor elkaar.
De publicatiemethode implementeren
Geef een package-specifieke tag op, zodat gebruikers deze resources los van andere resources kunnen publiceren.Het aanpassen van timestamps hangt af van een instelling
De officiële documentatie beschrijft dat de timestamps van migrations bij het publiceren worden bijgewerkt naar de huidige datum en tijd. In de implementatie vanServiceProvider::publishesMigrations() wordt de bron echter alleen aan de items voor timestampaanpassing toegevoegd als database.migrations.update_date_on_publish is ingeschakeld. De fallback bij het ophalen van deze instelling is false.
De standaardapplicatie van Laravel 13 bevat in config/database.php de volgende instelling. Controleer bij applicaties die een oudere structuur hebben overgenomen ook of deze instelling bestaat.
VendorPublishCommand de datum en tijd als het bestand overeenkomt met het werkelijke pad van een geregistreerde bron en de bestemmingsnaam het formaat YYYY_MM_DD_HHMMSS_ bevat. Uitgaande van het starttijdstip van het commando wordt per bestand één seconde opgeteld. Bevat de naam dit formaat niet, dan voegt deze stap geen datum en tijd toe.
Het bijwerken van timestamps hangt af van zowel de registratie in het package als de instellingen van de applicatie die het gebruikt. Wijzig deze instelling niet zomaar vanuit de provider van het package, maar beschrijf de voorwaarde in de installatie-instructies. Gebruik je een configuratiecache, dan moet die na het wijzigen van de instelling ook opnieuw worden opgebouwd.
Opnieuw publiceren is niet “alleen niet-uitgevoerde bestanden toevoegen”
vendor:publish controleert de uitvoeringsgeschiedenis in de database niet. Bovendien controleert de kopieerstap in v13.34.0 op bestaande bestanden aan de hand van de bestemming vóór de timestampaanpassing. Ook bij het publiceren van een map wordt eerst gecontroleerd of hetzelfde relatieve pad als de bron al op de bestemming bestaat, en pas daarna worden datum en tijd herschreven.
Als de datum en tijd bij de eerste publicatie zijn veranderd en er in de applicatie geen bestand met dezelfde naam als de bron staat, kan het opnieuw publiceren van dezelfde tag dus een bestand met een andere datum en tijd toevoegen. Ga er niet van uit dat je duplicaten altijd voorkomt door --force weg te laten.
Of iets is uitgevoerd, wordt bepaald aan de hand van de bestandsnaam
Migrator::getMigrationName() geeft de basisnaam van het bestand zonder .php terug. Om te bepalen of een migration nog niet is uitgevoerd, wordt deze naam vergeleken met de uitvoeringsgeschiedenis. Of de PHP-inhoud of de tabelnaam hetzelfde is, speelt bij deze beoordeling geen rol.
De methode met direct laden implementeren
Als je de migrations in het package direct wilt laten uitvoeren, registreer je een zoekpad. Bij deze methode voeg je geen stap toe om dezelfde bestanden te publiceren.loadMigrationsFrom() roept path() aan zodra de Migrator wordt geresolved. Migrator::path() verwijdert dubbele zoekpaden, en getMigrationFiles() gebruikt de migrationnaam als sleutel voor de gevonden bestanden en sorteert ze op die naam.
Wanneer een gebruiker het package bijwerkt, worden nieuwe bestanden bij de volgende migrate meegenomen. Wijzig de namen van bestaande bestanden niet en voeg voor nieuwe schemawijzigingen nieuwe bestanden toe. Neem ook de naam van de functionaliteit op, zoals in create_courier_deliveries_table, om conflicten met andere packages te voorkomen. Bestanden met dezelfde naam krijgen dezelfde sleutel; ze worden niet allebei onafhankelijk uitgevoerd.
Schemawijzigingen bij bestaande gebruikers krijgen
Wil je bijvoorbeeld een trackingnummer aan de bezorgtabel toevoegen, bewerk dan niet de al gepubliceerdecreate_courier_deliveries_table, maar voeg een nieuw bestand voor de wijziging toe. Als je een bestaande aanmaak-migration bewerkt, wordt die wijziging bij gebruikers die hem al hebben uitgevoerd niet doorgevoerd.
database/migrations/2026_10_02_000000_add_tracking_code_to_courier_deliveries_table.php
Wat je vóór een release controleert
Controleer naast de databasetests van het package ook de publicatie- en updateprocedure in een applicatie die het package gebruikt. Alleen migrations direct laden in tests betekent niet dat je de publicatiemethode, waarbij bestandsnamen veranderen, hebt gevalideerd.- Een eerste installatie op een lege database maakt de benodigde tabellen aan.
- Bij een update vanaf de database en uitvoeringsgeschiedenis van een oudere release worden alleen de nieuwe wijzigingen toegepast.
- Je hebt de bestandslijst bekeken na het herhaald uitvoeren van hetzelfde publicatiecommando, en de updateprocedure veroorzaakt geen duplicaten.
- De procedure houdt rekening met in- of uitgeschakelde timestampaanpassing en met bewerkte gepubliceerde bestanden.
- Je hebt de rollback van nieuwe migrations en de uitvoeringsvolgorde ten opzichte van de andere migrations van de applicatie gecontroleerd.
Gerelateerde pagina’s
Migrations
Bekijk de basis van schemadefinities, uitvoeringsgeschiedenis en rollbacks.
Packages testen
Test de service provider en de database van je package.
Packageconfiguratie samenvoegen en cachen
Bekijk updateprocedures die rekening houden met gebruikersinstellingen en de configuratiecache.
Versiecompatibiliteit beheren
Koppel updateprocedures en compatibiliteitswijzigingen aan je releasebeleid.
Geraadpleegde primaire bronnen
- Officiële Laravel-documentatie: migrations van packages
- ServiceProvider: registratie van te publiceren items en zoekpaden
- VendorPublishCommand: kopiëren en timestampaanpassing
- Migrator: detectie van bestanden en bepalen wat nog niet is uitgevoerd
- Standaardapplicatie van Laravel 13: databaseconfiguratie