Skip to main content

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

Met dit ene bestand configureer je routing, middleware en exceptieafhandeling. In Laravel 10 en eerder was deze configuratie verspreid over drie bestanden — 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

Dit bestand is de plek waar service providers worden geregistreerd. In Laravel 10 zette je die in de providers-array van config/app.php, maar dat is nu afgesplitst naar bootstrap/providers.php. Standaard bevat Laravel 11 alleen de AppServiceProvider.
Installeer je een package met composer require, dan kan die package bootstrap/providers.php automatisch bijwerken. config/app.php wordt niet genegeerd, maar voor nieuwe registraties is bootstrap/providers.php de aanbevolen plek geworden.

Wijzigingen in de map routes/

api.php en channels.php bestaan standaard niet. Je genereert ze zo nodig met een Artisan-commando.
In routes/console.php kun je ook de schedule definiëren.

Vervallen bestanden

De HTTP-kernel is opgenomen in Illuminate\Foundation\Http\Kernel binnen het framework. Middleware pas je aan via withMiddleware() in bootstrap/app.php.
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.
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.
Deze methode doet het volgende:
  1. Bepaalt de rootmap van de applicatie op basis van basePath
  2. Maakt een Application-instantie aan
  3. Wikkelt die in een ApplicationBuilder en past de standaardconfiguratie toe
  4. Geeft de ApplicationBuilder-instantie terug
Belangrijk is dat binnen configure() withKernels() / withEvents() / withCommands() / withProviders() al worden aangeroepen. Je hoeft deze in bootstrap/app.php niet opnieuw aan te roepen.

Configureren via method chaining

De aanroep van 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

Intern registreert dit een callback via AppRouteServiceProvider::loadRoutesUsing() en wordt de AppRouteServiceProvider geregistreerd tijdens het booten van de applicatie.
Aandachtspunten:
  • Op api-routes worden automatisch de api-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 health wordt ook tijdens onderhoudsmodus uitgezonderd (ingesteld via PreventRequestsDuringMaintenance::except())
  • Let op: api wordt vóór web geregistreerd. 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.
Geef je withBootstrapProviders: false door, dan wordt bootstrap/providers.php niet meer ingeladen. Laat dit weg tenzij je er een bijzondere reden voor hebt.

Overige belangrijke methodes

Ontwerpintentie: waarom is het zo opgezet?

”Code-first”-configuratie

In app/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”

Dat api.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:
  1. Uitvoering van register() van alle ServiceProviders
  2. registered() van de Application
  3. booting() van de Application
  4. Uitvoering van boot() van alle ServiceProviders
  5. booted() van de Application
Voeg de volgende code toe aan de AppServiceProvider om de uitvoeringsvolgorde te bekijken.
De methodes 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.
Laatst gewijzigd op 6 september 2026