Skip to main content
Service providers die bij het opstarten van Laravel worden geregistreerd, worden elke keer geladen — zelfs als hun functionaliteit tijdens het request geen enkele keer wordt gebruikt. Uitgestelde service providers (deferred service providers) lossen dit probleem op: het laden wordt uitgesteld totdat de service daadwerkelijk wordt gebruikt.
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 worden register() 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.
Maak je deze provider uitgesteld, dan wordt hij alleen geïnitialiseerd bij requests die daadwerkelijk een rapport genereren.

De DeferrableProvider-interface

Illuminate\Contracts\Support\DeferrableProvider is een simpele interface met één methode: provides().
Alleen al door deze interface te implementeren, gaat de provider in uitgestelde modus.

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.
Dankzij dit manifest weet Laravel — zonder bestanden te laden — “welke provider deze service aanbiedt”. De echte provider wordt pas geladen wanneer de betreffende service voor het eerst wordt geresolved.
Genereer het manifest opnieuw wanneer je providers toevoegt of wijzigt.

Interne flow


Het belang van de provides()-methode

Ontbreekt een service in provides(), dan wordt die service nooit geresolved.
Gebruik je de properties $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 in boot() doen, kun je niet uitstellen:
Je kunt in een uitgestelde provider wel een boot()-methode schrijven, maar de inhoud wordt pas uitgevoerd wanneer de service wordt geresolved. Zet je “altijd noodzakelijke verwerking” zoals routes of middleware in boot(), dan krijg je onverwacht gedrag.

De when()-methode — registratie via event-triggers

Met de methode when() 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.
Gaat een event af dat je via 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 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
  • Providers die routes registreren (loadRoutesFrom en 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.
Laatst gewijzigd op 6 september 2026