Vergelijking met Laravel 10 en eerder
In Laravel 11 is de applicatiestructuur grondig vernieuwd onder de naam “Slim Application Skeleton”. De grootste verandering is dat de verspreide configuratie is samengebracht op één plek:bootstrap/app.php.
Deze verandering geldt voor nieuwe projecten. Upgrade je een bestaande Laravel 10-applicatie, dan blijft de oude structuur gewoon werken.
De nieuwe mappen- en bestandsstructuur
Mappenstructuur van het skeleton
bootstrap/app.php — het middelpunt van de appconfiguratie
app/Http/Kernel.php, app/Console/Kernel.php en app/Exceptions/Handler.php — die hier nu zijn samengebracht.
bootstrap/providers.php — lijst van service providers
providers-array van config/app.php, maar dat is nu afgesplitst naar bootstrap/providers.php. Standaard bevat Laravel 11 alleen de AppServiceProvider.
Wijzigingen in de map routes/
api.php en channels.php bestaan standaard niet. Je genereert ze zo nodig met een Artisan-commando.
routes/console.php kun je ook de schedule definiëren.
Vervallen bestanden
app/Http/Kernel.php vervallen
app/Http/Kernel.php vervallen
De HTTP-kernel is opgenomen in
Illuminate\Foundation\Http\Kernel binnen het framework. Middleware pas je aan via withMiddleware() in bootstrap/app.php.app/Console/Kernel.php vervallen
app/Console/Kernel.php vervallen
De twee taken van de consolekernel zijn gescheiden. Artisan-commands plaats je in
app/Console/Commands/, waar ze automatisch worden gedetecteerd, en de schedule schrijf je in routes/console.php.app/Exceptions/Handler.php vervallen
app/Exceptions/Handler.php vervallen
De exception handler is opgenomen in
Illuminate\Foundation\Exceptions\Handler binnen het framework. Aanpassingen doe je via withExceptions() in bootstrap/app.php.Hoe Application::configure() werkt
Implementatie binnen het framework
Application::configure() is een statische methode van Illuminate\Foundation\Application.
- Bepaalt de rootmap van de applicatie op basis van
basePath - Maakt een
Application-instantie aan - Wikkelt die in een
ApplicationBuilderen past de standaardconfiguratie toe - Geeft de
ApplicationBuilder-instantie terug
configure() withKernels() / withEvents() / withCommands() / withProviders() al worden aangeroepen. Je hoeft deze in bootstrap/app.php niet opnieuw aan te roepen.
Configureren via method chaining
create() haalt de Application-instantie uit de ApplicationBuilder; wat bootstrap/app.php uiteindelijk met return teruggeeft, is deze Application-instantie.
Van request tot opgestarte app
public/index.php is het entrypoint: het laadt bootstrap/app.php en verkrijgt zo de Application. Daarna stuurt de HTTP-kernel het request door de middleware-pipeline en dispatcht de router het naar de controller.
Verdieping: de belangrijkste methodes van de ApplicationBuilder
withRouting() — de interne verwerking van routeregistratie
AppRouteServiceProvider::loadRoutesUsing() en wordt de AppRouteServiceProvider geregistreerd tijdens het booten van de applicatie.
- Op
api-routes worden automatisch deapi-middlewaregroep en de/api-prefix toegepast - Geef je een string door aan
health, dan wordt automatisch een healthcheck-endpoint geregistreerd (standaard/up) - Het pad van
healthwordt ook tijdens onderhoudsmodus uitgezonderd (ingesteld viaPreventRequestsDuringMaintenance::except()) - Let op:
apiwordt vóórwebgeregistreerd. Definieer je op hetzelfde pad zowel een web- als een API-route, dan krijgt de API-route voorrang - Geef je een string door aan
pages, dan wordt de routing van Laravel Folio ingeschakeld
withMiddleware() — middleware aanpassen
withMiddleware() voert de callback pas uit nadat de HttpKernel is geresolved, dankzij de afterResolving()-hook. Het Middleware-object dat aan de callback wordt doorgegeven heeft een rijke set aanpassingsmethodes.
withExceptions() — exceptieafhandeling configureren
withExceptions() registreert de Handler-klasse van het framework als singleton en stelt de callback in via afterResolving(). De callback krijgt een Exceptions-wrapperobject doorgegeven.
withProviders() — service providers registreren
withProviders() wordt standaard aangeroepen binnen Application::configure(), dus bootstrap/providers.php wordt automatisch ingeladen. Wil je extra providers doorgeven, dan moet je de methode expliciet aanroepen in bootstrap/app.php.
Overige belangrijke methodes
Ontwerpintentie: waarom is het zo opgezet?
”Code-first”-configuratie
Inapp/Http/Kernel.php van Laravel 10 en eerder werd middleware opgesomd in arrays. Dat leek meer op een configuratiebestand, met als nadeel dat het typesysteem van PHP en IDE-ondersteuning weinig hielpen.
In Laravel 11 is dit veranderd in de callbackstijl withMiddleware(function (Middleware $middleware) { ... }). Daardoor werkt typeaanvulling en kun je op natuurlijke wijze dynamische configuratie schrijven met condities en lussen.
Van “conventie boven configuratie” naar “expliciete configuratie”
Datapi.php opt-in is geworden, lost het probleem op dat de api-middlewaregroep altijd werd geladen, ook in applicaties die geen API-routes gebruiken. De filosofie: functionaliteit die je niet gebruikt, bestaat standaard niet.
Slim gebruik van de afterResolving()-hook
Dat withMiddleware() en withExceptions() gebruikmaken van afterResolving() is om volgordeproblemen in de configuratie te vermijden. De methodes van de ApplicationBuilder worden aangeroepen voordat de applicatie volledig is opgestart, maar de daadwerkelijke verwerking (het toepassen van de configuratie op de kernel) wordt uitgesteld tot het moment waarop de kernel voor het eerst wordt geresolved.
Praktijkvoorbeelden van aanpassingen
API en web naast elkaar
Middleware aanpassen
De schedule samenbrengen in bootstrap/app.php
Je kunt de schedule in routes/console.php schrijven, maar met withSchedule() bundel je alles in bootstrap/app.php.
Exceptieafhandeling aanpassen
Containerbindings beheren in bootstrap/app.php
Bij een kleine applicatie kun je simpele bindings ook in bootstrap/app.php zetten in plaats van in de AppServiceProvider.
De volgorde van het opstartproces van Laravel
Bij het opstarten van een Laravel-applicatie worden de service providers en de hooks van de Application in deze volgorde uitgevoerd:- Uitvoering van
register()van alle ServiceProviders registered()van de Applicationbooting()van de Application- Uitvoering van
boot()van alle ServiceProviders booted()van de Application
AppServiceProvider om de uitvoeringsvolgorde te bekijken.
registered(), booting() en booted() van de ApplicationBuilder registreren alleen een callback bij de Application. Normaal heb je ze niet nodig, maar ze maken bijzondere handelingen mogelijk, zoals via booted() wijzigingen aanbrengen in de kernel nadat die klaar is met opstarten.
Volgende stappen
Service container
Begrijp de werking van de service container die de
ApplicationBuilder intern gebruikt.FAQ nieuwe appstructuur
Veelgestelde vragen en antwoorden over de nieuwe applicatiestructuur.