ServiceProvider::optimizes() kun je de commands voor het aanmaken en verwijderen opnemen in Laravels optimize en optimize:clear.
Deze pagina bouwt voort op Laravel-packages ontwikkelen en bekijkt de implementatie van Laravel Framework v13.35.0. Het gaat hier niet om het formaat van cachebestanden, maar om de afspraken rond registratie en beheer.
Commands registreren en taken registreren zijn twee verschillende dingen
commands() registreert commandklassen die je via Artisan kunt aanroepen. optimizes() is een aparte stap die de namen van al uitvoerbare commands als optimalisatietaken registreert. Als je alleen optimizes() aanroept, worden de commandklassen niet geregistreerd.
Het volgende voorbeeld gaat ervan uit dat het package al CacheMetadataCommand en ClearMetadataCommand bevat, met respectievelijk courier:cache en courier:clear-cache als $signature.
optimizes() zijn nullable, dus je kunt ook alleen een aanmaak- of alleen een verwijdercommand registreren. Leg gebruikers in dat geval wel altijd uit met welke stap de gegenereerde cache ongeldig wordt gemaakt.
Ook de registratiesleutel is een afspraak met gebruikers
ServiceProvider slaat aanmaakcommands op in de statische array $optimizeCommands en verwijdercommands in $optimizeClearCommands. In beide gevallen wordt key de arraysleutel.
Laat je key weg, dan wordt een naam afgeleid van de klassenaam van de provider. Voor CourierServiceProvider is dat bijvoorbeeld courier. Omdat alleen de klassenaam wordt gebruikt, kunnen providers met dezelfde naam in verschillende namespaces met elkaar botsen.
Registreer je opnieuw onder dezelfde sleutel, dan wordt het command aan die kant overschreven door de latere waarde. Wil je meerdere taken registreren, geef dan verschillende sleutels op. Vermijd ook de sleutels van Laravels standaardtaken, zoals config en routes. Wanneer standaardtaken en packagetaken worden samengevoegd, worden gelijke stringsleutels namelijk eveneens overschreven.
Packagetaken draaien na de standaardtaken
In de bekeken implementatie voegen beide commands de geregistreerde arrays van packages toe aan de array met standaardtaken en roepen ze die vervolgens op volgorde aan. Gebruik je een sleutel die niet botst, dan worden packagetaken na de standaardtaken toegevoegd.
Ga uit van deze volgorde en laat het aanmaakcommand alleen de data genereren die het package zelf bezit, in plaats van andere standaardcaches opnieuw op te bouwen. Gebruik
optimizes() niet als API om afhankelijkheden in volgorde tussen meerdere packages te regelen. Heb je een strikte volgorde nodig, zet de betreffende commands dan expliciet achter elkaar.
Uitsluiten op sleutel of commandnaam
De optie--except van beide commands accepteert kommagescheiden waarden. Van elke waarde wordt de witruimte aan het begin en eind verwijderd, en taken waarvan de sleutel of commandnaam overeenkomt, worden overgeslagen.
cache:clear uit. cache is de sleutel van een taak en geen naam die specifiek voor het package is.
Een uitsluiting geldt alleen voor die ene uitvoering. Het is geen instelling die de registratie in de provider uitschakelt of eerder aangemaakte packagecaches automatisch verwijdert.
Maak onderscheid tussen FAIL bij een taak en de exitcode van het bovenliggende command
OptimizeCommand en OptimizeClearCommand roepen elke taak aan met callSilently() en geven aan de taakweergave door of de exitcode 0 is. De normale uitvoer van het onderliggende command wordt niet getoond, dus om een oorzaak te onderzoeken voer je het eigen command rechtstreeks uit.
In Laravel v13.35.0 geven beide handle()-methoden een niet-nul waarde van een onderliggend command niet door als returnwaarde van het bovenliggende command. Ook als FAIL op het scherm verschijnt, gaat de lus door, en zonder exception is de exitcode van het bovenliggende command 0. Een opgeworpen exception wordt daarentegen door de taakweergavecomponent opnieuw opgeworpen, dus daar geldt niet hetzelfde doorgaande gedrag.
Als het aanmaken van de packagecache een harde voorwaarde voor de deployment is, kies dan een procedure waarin je de exitcode van het onderliggende command direct kunt controleren. Het volgende voorbeeld sluit de packagetaak uit van de gezamenlijke uitvoering en voert die na de standaardtaken eenmaal rechtstreeks uit.
courier:cache doorwerken in de exitcode, maar vangt geen niet-nul exitcodes van de standaardtaken op. Moet je deployment ook die strikt detecteren, voer dan de benodigde commands afzonderlijk uit en controleer telkens de exitcode.
Caches ontwerpen en controleren die updates overleven
Leg naast de registratie ook de verantwoordelijkheden van de commands en van de code die de cache leest vast.- Aanmaken leidt bij herhaald uitvoeren met dezelfde invoer tot dezelfde toestand, en maakt bij een fout halverwege geen onvolledige data actief.
- Verwijderen voltooit ook zonder fouten als er geen cache bestaat, en verwijdert geen door de gebruiker gepubliceerde configuratie of persistente data.
- Een command waarvan het aanmaken mislukt, meldt een fout en geeft een niet-nul waarde terug. Ook de lezende code behandelt een beschadigde cache niet zonder meer als geldig.
- Als je het cacheformaat wijzigt, vertel gebruikers dan dat ze de cache opnieuw moeten aanmaken en overweeg ook langlopende processen te herstarten.
Gerelateerde pagina’s
Packageconfiguratie samenvoegen en cachen
Bekijk hoe gepubliceerde configuratie wordt aangevuld en hoe dat samenhangt met het opnieuw opbouwen van de configuratiecache.
Laravel-packages testen met Orchestra Testbench
Registreer providers en Artisan-commands in je testomgeving.
Geraadpleegde primaire bronnen
- Officiële Laravel-documentatie: Optimize commands
- ServiceProvider: optimizes() en registratiesleutels
- OptimizeCommand: taken en uitsluitingen
- OptimizeClearCommand: verwijdertaken en uitvoeringsvolgorde
- Command: returnwaarde van handle() en exitcode
- Task: weergave van resultaten en opnieuw opwerpen van exceptions