Vergleich mit Laravel 10 und älter
Mit Laravel 11 wurde die Anwendungsstruktur als „Slim Application Skeleton” grundlegend überarbeitet. Die größte Änderung: verstreute Einstellungen werden nun an einer einzigen Stelle inbootstrap/app.php gebündelt.
Diese Änderung betrifft neue Projekte. Bestehende Laravel-10-Anwendungen laufen nach einem Upgrade in ihrer alten Struktur weiter.
Neue Verzeichnis- und Dateistruktur
Struktur des Skeletons
bootstrap/app.php — Zentrum der Konfiguration
app/Http/Kernel.php, app/Console/Kernel.php und app/Exceptions/Handler.php verteilt war, ist hier zusammengefasst.
bootstrap/providers.php — Liste der Service Provider
providers-Array von config/app.php; jetzt ist es in bootstrap/providers.php getrennt. Standardmäßig ist nur der AppServiceProvider eingetragen.
Änderungen am routes/-Verzeichnis
api.php und channels.php sind standardmäßig nicht vorhanden. Erzeugen Sie sie bei Bedarf per Artisan.
routes/console.php können Sie auch Scheduler-Aufgaben definieren.
Entfallene Dateien
Wegfall von app/Http/Kernel.php
Wegfall von app/Http/Kernel.php
Der HTTP-Kernel ist in
Illuminate\Foundation\Http\Kernel im Framework integriert. Middleware-Anpassungen erfolgen über withMiddleware() in bootstrap/app.php.Wegfall von app/Console/Kernel.php
Wegfall von app/Console/Kernel.php
Die beiden Aufgaben des Console-Kernels sind getrennt: Artisan-Commands liegen in
app/Console/Commands/ und werden automatisch erkannt, Scheduler-Definitionen stehen in routes/console.php.Wegfall von app/Exceptions/Handler.php
Wegfall von app/Exceptions/Handler.php
Der Exception-Handler ist in
Illuminate\Foundation\Exceptions\Handler im Framework integriert. Anpassungen erfolgen über withExceptions() in bootstrap/app.php.Wie Application::configure() funktioniert
Implementierung im Framework
Application::configure() ist eine statische Methode von Illuminate\Foundation\Application.
- Bestimmt aus
basePathdas Wurzelverzeichnis der Anwendung. - Erzeugt eine
Application-Instanz. - Verpackt sie in einem
ApplicationBuilderund wendet Standardeinstellungen an. - Gibt den
ApplicationBuilderzurück.
configure() werden bereits withKernels(), withEvents(), withCommands() und withProviders() aufgerufen — in bootstrap/app.php müssen Sie sie nicht erneut aufrufen.
Konfiguration per Method-Chain
create() extrahiert aus dem ApplicationBuilder die Application; genau diese Instanz gibt bootstrap/app.php per return zurück.
Ablauf vom Request bis zum App-Start
public/index.php ist der Einstiegspunkt; die Datei lädt bootstrap/app.php und erhält die Application. Danach führt der HTTP-Kernel den Request durch die Middleware-Pipeline, der Router dispatched an den Controller.
Wichtige Methoden des ApplicationBuilder im Detail
withRouting() — interne Routen-Registrierung
AppRouteServiceProvider::loadRoutesUsing() ein Callback registriert; beim Booting wird der AppRouteServiceProvider eingehängt.
- Für
api-Routen werden automatisch die Middleware-Gruppeapiund der Prefix/apiangewandt. - Ein String an
healthregistriert einen Health-Check-Endpoint (Default/up) automatisch. - Der
health-Pfad ist im Wartungsmodus ausgeschlossen (PreventRequestsDuringMaintenance::except()). apiwird vorwebregistriert. Bei identischen Pfaden hatapiVorrang.- Ein String an
pagesaktiviert das Routing von Laravel Folio.
withMiddleware() — Middleware anpassen
withMiddleware() führt den Callback aus, nachdem der HttpKernel aufgelöst wurde — mittels afterResolving(). Dem Callback wird ein Middleware-Objekt mit vielen Anpassungsmethoden übergeben.
withExceptions() — Exception-Handling konfigurieren
withExceptions() registriert die Handler-Klasse als Singleton und setzt den Callback per afterResolving(). Dem Callback wird ein Exceptions-Wrapper übergeben.
withProviders() — Service Provider registrieren
withProviders() innerhalb von Application::configure() automatisch aufgerufen wird, lädt Laravel bootstrap/providers.php von selbst. Für zusätzliche Provider rufen Sie es in bootstrap/app.php explizit auf.
Weitere wichtige Methoden
Designintention: warum es so ist
„Code-First”-Konfiguration
Inapp/Http/Kernel.php (Laravel 10) wurde Middleware als Array aufgelistet — eher wie eine Config-Datei. Das erschwerte Typunterstützung und IDE-Feedback.
In Laravel 11 hat sich das zu einem Callback-Stil geändert: withMiddleware(function (Middleware $middleware) { ... }). So funktioniert Typvervollständigung, und Sie schreiben Verzweigungen oder Schleifen natürlich für dynamische Konfiguration.
Von „Convention over Configuration” zu „Explicit Configuration”
api.php ist Opt-in geworden, damit Anwendungen ohne API-Routen nicht permanent die api-Middleware-Gruppe laden. Was nicht gebraucht wird, existiert per Default nicht.
Nutzung von afterResolving()-Hooks
withMiddleware() und withExceptions() verwenden afterResolving(), um Konfigurationsreihenfolge-Probleme zu vermeiden. Die Methoden am ApplicationBuilder werden vor dem vollständigen Start aufgerufen; die tatsächliche Anwendung erfolgt verzögert beim ersten Auflösen des Kernels.
Praktische Anpassungsbeispiele
API und Web nebeneinander
Middleware anpassen
Scheduler in bootstrap/app.php bündeln
Sie können den Scheduler in routes/console.php beschreiben — oder alles über withSchedule() in bootstrap/app.php bündeln.
Exception-Handling anpassen
Container-Bindings in bootstrap/app.php verwalten
In kleinen Anwendungen können Sie einfache Bindings statt im AppServiceProvider direkt in bootstrap/app.php beschreiben.
Reihenfolge des Anwendungsstarts
Beim Start der Laravel-Anwendung laufen Service Provider und Application-Hooks in dieser Reihenfolge:register()aller Service Provider.registered()der Application.booting()der Application.boot()aller Service Provider.booted()der Application.
AppServiceProvider lässt sich das nachverfolgen.
registered(), booting() und booted() am ApplicationBuilder registrieren nur Callbacks. Üblicherweise braucht man sie nicht, aber sie erlauben Sonderfälle — etwa Anpassungen am bereits gebooteten Kernel per booted().
Nächste Schritte
Service Container
Verstehen Sie den Service Container, den der
ApplicationBuilder intern nutzt.FAQ zur neuen App-Struktur
Häufige Fragen und Antworten zur neuen Anwendungsstruktur.