Skip to main content

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 in bootstrap/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

Mit dieser einen Datei konfigurieren Sie Routing, Middleware und Exception-Handling. Was in Laravel 10 auf 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

Diese Datei registriert die Service Provider. In Laravel 10 stand das im providers-Array von config/app.php; jetzt ist es in bootstrap/providers.php getrennt. Standardmäßig ist nur der AppServiceProvider eingetragen.
Beim composer require eines Pakets aktualisiert dieses ggf. bootstrap/providers.php automatisch. config/app.php wird zwar noch gelesen, aber Neuregistrierungen erfolgen bevorzugt in bootstrap/providers.php.

Änderungen am routes/-Verzeichnis

api.php und channels.php sind standardmäßig nicht vorhanden. Erzeugen Sie sie bei Bedarf per Artisan.
In routes/console.php können Sie auch Scheduler-Aufgaben definieren.

Entfallene Dateien

Der HTTP-Kernel ist in Illuminate\Foundation\Http\Kernel im Framework integriert. Middleware-Anpassungen erfolgen über withMiddleware() in bootstrap/app.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.
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.
Die Methode:
  1. Bestimmt aus basePath das Wurzelverzeichnis der Anwendung.
  2. Erzeugt eine Application-Instanz.
  3. Verpackt sie in einem ApplicationBuilder und wendet Standardeinstellungen an.
  4. Gibt den ApplicationBuilder zurück.
Wichtig: In 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

Intern wird an AppRouteServiceProvider::loadRoutesUsing() ein Callback registriert; beim Booting wird der AppRouteServiceProvider eingehängt.
Wichtige Punkte:
  • Für api-Routen werden automatisch die Middleware-Gruppe api und der Prefix /api angewandt.
  • Ein String an health registriert einen Health-Check-Endpoint (Default /up) automatisch.
  • Der health-Pfad ist im Wartungsmodus ausgeschlossen (PreventRequestsDuringMaintenance::except()).
  • api wird vor web registriert. Bei identischen Pfaden hat api Vorrang.
  • Ein String an pages aktiviert 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

Da 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.
withBootstrapProviders: false überspringt bootstrap/providers.php. Nur mit gutem Grund weglassen.

Weitere wichtige Methoden

Designintention: warum es so ist

„Code-First”-Konfiguration

In app/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:
  1. register() aller Service Provider.
  2. registered() der Application.
  3. booting() der Application.
  4. boot() aller Service Provider.
  5. booted() der Application.
Mit folgendem Code im 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.
Zuletzt geändert am 13. Juli 2026