ServiceProvider van Laravel 13 en zie je hoe je configuratie onderhoudt als publieke API van je package. De pagina gaat uit van Laravel-packages ontwikkelen en de implementatie is gecontroleerd met v13.34.0 van laravel/framework.
Publiceren en samenvoegen zijn aparte processen
publishes() registreert een bron en een doel om te kopiëren. Tot vendor:publish het bestand kopieert, verandert de config-map van de gebruiker niet. mergeConfigFrom() werkt daarentegen de configuratierepository bij tijdens het opstarten en past het bestand zelf niet aan.
register().
mergeConfigFrom() voegt alleen het hoogste niveau samen
ServiceProvider::mergeConfigFrom() voert array_merge() uit met eerst de packageconfiguratie en daarna de bestaande configuratie van de applicatie. Bij dezelfde stringsleutel krijgt de waarde van de applicatie voorrang.
Het volgende voorbeeld bootst het samenvoegen door het framework na met alleen arrays.
enabled op het hoogste niveau wordt aangevuld, maar transport wordt als geheel vervangen. transport.retries blijft niet behouden. Belangrijk: als de gebruiker al een oude transport-array heeft gepubliceerd, worden nieuwe sleutels die je aan diezelfde array toevoegt niet aangevuld.
Geneste configuratie aanvullen met replaceConfigRecursivelyFrom()
DeServiceProvider van Laravel 13 heeft ook de protected methode replaceConfigRecursivelyFrom(). Deze voert array_replace_recursive() uit in dezelfde volgorde.
Wil je een configuratie-API waarin geneste stringsleutels afzonderlijk kunnen worden overschreven, pas dan de register() van de provider als volgt aan. Je hoeft deze voor dezelfde configuratiesleutel niet te combineren met de eerdere mergeConfigFrom().
$defaults en $overrides is het resultaat als volgt.
replaceConfigRecursivelyFrom() is een methode die bestaat in de broncode van Laravel 13 die op deze pagina is gecontroleerd. Onderscheid deze van mergeConfigFrom(), die de officiële documentatie over packageontwikkeling beschrijft, en controleer de bijbehorende frameworkimplementatie voordat je hem gebruikt.Lijsten met numerieke sleutels worden niet volledig vervangen
Recursief vervangen is geen proces dat “de hele array door de waarde van de gebruiker vervangt”. Ook bij numerieke sleutels wordt de waarde van dezelfde sleutel vervangen en blijven sleutels die de gebruiker niet heeft opgegeven behouden.['slack'] opgeeft, blijft database staan. En als je ['channels' => []] doorgeeft, wordt de standaardlijst niet leeg. Let hier vooral op bij configuratie waarbij het opgeven van de volledige lijst betekenis heeft, zoals notificatiekanalen of middleware.
Heb je zulke configuratie, kijk dan eerst naar de structuur: zet bijvoorbeeld lijsten en gedeeltelijk overschrijfbare associatieve arrays onder aparte sleutels op het hoogste niveau en gebruik ondiep samenvoegen. Als je de samenvoegmethode wijzigt in een package dat al is uitgebracht, verandert het gedrag van hetzelfde configuratiebestand. Behandel dit dus niet als een simpele vervanging van de implementatie.
De configuratiecache slaat de samengevoegde waarden op
Beide methoden slaan het samenvoegen over wanneer de applicatieCachesConfiguration implementeert en configurationIsCached() true teruggeeft. In een normale Laravel-applicatie is dat het geval bij een start waarbij een configuratiecache bestaat.
ConfigCacheCommand verwijdert de oude configuratiecache, start een nieuwe applicatie op en haalt de volledige configuratierepository op. Tijdens die start wordt de configuratie van de providers samengevoegd en wordt het resultaat in het cachebestand opgeslagen. Bij volgende starts leest LoadConfiguration die waarden in.
Als je het package bijwerkt en de standaardwaarden of de samenvoegmethode veranderen, wordt dat dus niet doorgevoerd in applicaties die een oude cache blijven gebruiken. Bij deployments die de configuratiecache gebruiken, bouw je de cache opnieuw op met de bijgewerkte code.
php artisan config:clear. Bepaal niet zelf waar de cache wordt aangemaakt, maar laat het beheer over aan de commando’s van Laravel.
Controles voordat je configuratiewijzigingen uitbrengt
Gebruik in de tests van je package niet alleen ongepubliceerde configuratie als invoer, maar ook configuratie die is overgebleven van eerdere versies.- Ook zonder gepubliceerde configuratie zijn de benodigde standaardwaarden beschikbaar.
- Met oude gepubliceerde configuratie krijgen de waarden van de gebruiker voorrang en worden nieuwe opties aangevuld zoals ontworpen.
- Het overschrijfcontract verandert niet voor geneste arrays, lijsten met numerieke sleutels en lege arrays.
config:cacheslaagt in de gebruikende applicatie en een andere start die de cache gebruikt levert dezelfde configuratie op.
Gerelateerde pagina’s
Packages testen
Registreer de service provider en controleer het gedrag van configuratie en services.
Versiecompatibiliteit beheren
Koppel wijzigingen in de publieke API aan je releasebeleid en doorlopend onderhoud.