Deze pagina gaat uit van kennis van de basis van packageontwikkeling. We raden aan eerst de basiswerking van service providers te begrijpen.
Waarom uitgestelde providers nodig zijn
Bij een gewone service provider wordenregister() en boot() bij elk request aangeroepen. Het is verspilling om functionaliteit die niet op elke pagina wordt gebruikt — e-mail, queues, cache — telkens te initialiseren.
De DeferrableProvider-interface
Illuminate\Contracts\Support\DeferrableProvider is een simpele interface met één methode: provides().
Basisimplementatie
De implementatie van een uitgestelde provider bestaat uit drie stappen.1
DeferrableProvider implementeren
2
Services binden in register()
Net als bij een gewone provider schrijf je de bindings in
register().3
De geregistreerde services teruggeven in provides()
provides() moet alle services teruggeven die je in register() hebt gebonden. Op basis van deze lijst bepaalt Laravel “bij welke gevraagde service deze provider geladen moet worden”.Hoe het servicemanifest werkt
Laravel genereert bij het opstarten een manifestbestand:bootstrap/cache/services.php. In dit bestand staat de lijst met services die uitgestelde providers aanbieden.
Interne flow
Het belang van de provides()-methode
Ontbreekt een service inprovides(), dan wordt die service nooit geresolved.
$bindings / $singletons, dan neem je die op dezelfde manier op in provides().
Beperkingen van uitgestelde providers
Uitgestelde providers zijn geschikt voor providers die alleen bindings registreren in de container. Providers die het volgende inboot() doen, kun je niet uitstellen:
De when()-methode — registratie via event-triggers
Met de methodewhen() kun je de provider laten registreren wanneer een specifiek event afgaat. Dit is bruikbaar voor providers die alleen in een bepaalde context nodig zijn, zoals jobverwerking.
when() hebt teruggegeven, dan wordt de provider geladen — ook als de service niet direct wordt geresolved.
Toepassing bij packageontwikkeling
Ook bij distributie als third-party package dragen uitgestelde providers bij aan de prestaties van de applicatie van de gebruiker.Aanbevolen patroon
mergeConfigFrom() controleert intern of de configuratie gecachet is en is dus veilig aan te roepen binnen register() van een uitgestelde provider. Is de configuratie al gecachet, dan doet de methode niets.Registratie van Artisan-commands scheiden met runningInConsole()
Commandregistratie is alleen nodig wanneer Artisan draait, dus je vertakt met runningInConsole(). Maar wil je een provider die commands aanbiedt uitstellen, neem dan ook de commandklassen op in provides() of maak een aparte provider alleen voor commands.
Voorbeelden uit de Laravel-core
Veel van de core providers van Laravel zijn uitgestelde providers. Het ontwerp voorkomt dat alle services die niet bij elk request nodig zijn direct worden geladen.
In een applicatie met alleen API-endpoints komt het voor dat de
MailServiceProvider en BroadcastServiceProvider tijdens een request geen enkele keer worden geladen.
Criteria: wel of niet uitstellen?
Services die geschikt zijn voor uitstel
Services die geschikt zijn voor uitstel
- Services die niet bij elk request worden gebruikt (e-mail, rapporten, externe API-clients, enzovoort)
- Services waarvan de initialisatie externe verbindingen of het inlezen van bestanden vereist
- Services met een zware objectgraaf
- Providers die commands aanbieden die alleen via de CLI worden gebruikt
Services die niet geschikt zijn voor uitstel
Services die niet geschikt zijn voor uitstel
- Providers die routes registreren (
loadRoutesFromen dergelijke) - Providers die altijd actieve middleware of exception handlers registreren
- Providers die globale scopes of observers van Eloquent registreren
- Lichte services die in het merendeel van de requests worden gebruikt (de overhead van uitstel kan dan groter zijn)
Gerelateerde pagina’s
Basis van packageontwikkeling
Uitleg over het ontwikkelen van Laravel-packages met de service provider als kern.
Versiecompatibiliteit van packages beheren
Onderhoudsstrategieën voor packages die meegroeien met major versies van Laravel en PHP.