PHP Framework

Laravel

Laravel ist das PHP-Framework, das für die Zufriedenheit der Entwickler gebaut wurde: expressives Routing, das Eloquent ORM, Blade-Templates und ein Ökosystem, das alles von der Authentifizierung bis zum Deployment abdeckt.

intermediate16 min readUpdated 16. Sept. 2026
routes/web.php
php
<?php
// routes/web.php

use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{post}', [PostController::class, 'show']);

Route::middleware('auth:sanctum')->group(function () {
    Route::post('/posts', [PostController::class, 'store']);
    Route::put('/posts/{post}', [PostController::class, 'update']);
});
Veröffentlicht
2011
Erfinder
Taylor Otwell
Sprache
PHP
Architektur
MVC
ORM
Eloquent
CLI
Artisan
Templating
Blade

Warum es wichtig ist

Warum Laravel-Entwickler so produktiv sind

Batteries included

Authentifizierung, Autorisierung, Queues, Mail, Benachrichtigungen, Caching, Dateispeicher und Scheduling sind bereits im Framework enthalten. Du verbringst deine Zeit mit dem Produkt anstatt damit, Pakete auszuwählen und zu konfigurieren.

Eloquent macht Daten angenehm

Models werden auf Tabellen gemappt, Beziehungen lesen sich wie Sätze und Migrationen, Factories sowie Seeder existieren direkt neben dem Code, den sie beschreiben.

Artisan und ein tiefes Ökosystem

Die Artisan-Kommandozeile generiert die repetitiven Teile, während Forge, Vapor, Nova und Livewire Deployment, Serverless, Admin-Panels und reaktive UIs abdecken.

Das Gesamtbild

Eloquent, Artisan, Ökosystem

Models beherrschen die Datenbank, die Kommandozeile generiert die langweiligen Teile und ein tiefes Ökosystem erledigt den Rest.

Eloquent

Model

Ein Active-Record ORM, bei dem jedes Model eine Tabelle, seine Beziehungen und seine Query-Shortcuts besitzt.

Routing & Controller

Handle

web.php und api.php definieren Endpunkte, Route Model Binding injiziert Datensätze und Controller halten die Handler schlank.

Migrationen

Evolve

Schema-Änderungen sind versionierte PHP-Dateien, sodass jede Umgebung dieselbe Datenbank aus derselben Historie aufbaut.

HTML5 auf einen Blick

Die Laravel-Toolbox

Routing

Deklarative Endpunkte in web.php und api.php, mit Resource-Routes und Route Model Binding.

Middleware

HTTP-Filter für Authentifizierung, Throttling und CORS, konfiguriert in bootstrap/app.php.

Eloquent

Models, Beziehungen, Scopes und ein expressiver Query Builder.

Migrationen

Versionierte Schema-Änderungen sowie Factories und Seeder für realistische Testdaten.

Blade

Eine Templating-Engine mit Layouts, Komponenten und standardmäßig escapedem Output.

Artisan

Code generieren, Migrationen ausführen, Queues dispatchen und Hintergrundaufgaben planen.

Eine kurze Geschichte

Vom Solo-Projekt zur vollständigen Plattform

  1. 2011

    Laravel 1

    Taylor Otwell veröffentlicht ein Framework, das die PHP-Entwicklung wieder angenehm machen soll.

    11
  2. 2013

    Laravel 4

    Das Framework wird um Composer und die wiederverwendbaren Illuminate-Komponenten herum neu geschrieben.

    13
  3. 2015

    Laravel 5

    Eine klarere Verzeichnisstruktur, bessere Artisan-Befehle und ein wachsendes Ökosystem nehmen Gestalt an.

    15
  4. 2020

    Laravel 8

    Model-Factories, Job-Batching und Jetstream modernisieren den Application-Stack.

    20
  5. 2024

    Laravel 11

    Ein schlankeres Skeleton verschiebt die Middleware- und Exception-Konfiguration nach bootstrap/app.php.

    24
  6. Heute

    Eine vollständige Plattform

    Forge, Vapor, Nova, Livewire und Sanctum decken Deployment, Admin-Panels und Authentifizierung ab.

    Heute

Der vollständige Leitfaden

Laravel: Alles was Sie wissen müssen

Was ist Laravel?

Laravel ist ein Full-Stack PHP Framework, das auf einem einfachen Versprechen basiert: die Webentwicklung angenehm zu gestalten, ohne dabei an Leistungsfähigkeit einzubüßen. Es folgt dem MVC-Pattern, wobei die Architektur weniger im Vordergrund steht als das Gefühl bei der Nutzung. Das Routing ist ausdrucksstark, die Datenbank-Schicht liest sich fast wie Englisch, und die Komponenten, die man sonst aus einem Dutzend verschiedener Bibliotheken zusammensetzen müsste, sind bereits integriert.

Es wurde 2011 von Taylor Otwell erschaffen und hat sich seitdem zum populärsten PHP Framework entwickelt. Dabei geht das Ökosystem weit über das Framework selbst hinaus: Forge und Vapor für das Deployment, Nova für Admin-Panels, Livewire für reaktive Interfaces und Sanctum für die Authentifizierung.

Wenn man PHP bisher „von Hand“ geschrieben hat, fühlt sich Laravel so an, als hätte endlich jemand den Werkzeugkasten aufgeräumt.

Routing und Controller

Jede Anfrage läuft über eine Route. Web-Routes befinden sich in routes/web.php und API-Routes in routes/api.php, wobei beide dieselbe ausdrucksstarke Syntax verwenden.

<?php

use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{post}', [PostController::class, 'show']);
Route::post('/posts', [PostController::class, 'store']);

Route::apiResource('posts', PostController::class);

Route::apiResource generiert mit einer einzigen Zeile den konventionellen Satz an Index-, Store-, Show-, Update- und Destroy-Routes. Ein Controller enthält dann pro Aktion eine Methode, wodurch jeder Handler kompakt bleibt.

class PostController extends Controller
{
    public function index()
    {
        return Post::latest()->paginate(20);
    }

    public function store(StorePostRequest $request)
    {
        $post = $request->user()->posts()->create($request->validated());

        return response()->json($post, 201);
    }
}

Route Model Binding

Laravel kann einen Routen-Parameter automatisch in eine Modell-Instanz umwandeln. Benennen Sie den Parameter nach dem Modell und verwenden Sie Type-Hinting im Controller; Laravel ruft dann den entsprechenden Datensatz ab oder gibt einen 404 zurück.

Route::get('/posts/{post}', [PostController::class, 'show']);

public function show(Post $post)
{
    return $post->load('author');
}

Standardmäßig wird der Primärschlüssel des Modells verwendet. Fügen Sie getRouteKeyName() hinzu, um stattdessen über einen Slug zu binden. So erhalten Sie saubere URLs wie /posts/hello-world, ohne zusätzlichen Code für die Suche schreiben zu müssen.

Eloquent: das ORM, bei dem man bleibt

Eloquent ist das Active-Record ORM von Laravel. Ein Model wird dabei einer Tabelle zugeordnet, und Beziehungen werden als Methoden definiert.

class Post extends Model
{
    protected $fillable = ['title', 'slug', 'body'];

    public function author(): BelongsTo
    {
        return $this->belongsTo(User::class, 'user_id');
    }

    public function scopePublished($query)
    {
        return $query->whereNotNull('published_at');
    }
}

Zu den Beziehungen gehören hasMany, belongsTo, belongsToMany, hasManyThrough sowie polymorphe Varianten. Die wichtigste praktische Regel ist das Eager Loading von Beziehungen, von denen man weiß, dass sie benötigt werden:

$posts = Post::with('author')->published()->latest()->get();

Ohne with('author') löst der Zugriff auf $post->author innerhalb einer Schleife eine Abfrage pro Zeile aus – das klassische N+1-Problem. Eager Loading reduziert dies auf zwei Abfragen, unabhängig davon, wie viele Posts abgerufen werden.

Migrationen, Factories und Seeder

Schema-Änderungen werden in versionierten PHP-Dateien gespeichert, sodass jede Umgebung auf Basis derselben Historie aufgebaut wird.

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->cascadeOnDelete();
    $table->string('title');
    $table->string('slug')->unique();
    $table->text('body');
    $table->timestamps();
});

Führen Sie diese mit php artisan migrate aus. Factories beschreiben, wie ein Modell gefaked wird, und Seeder befüllen eine Datenbank mit bekannten Daten.

Post::factory()->count(50)->for(User::factory())->create();

Zusammen sorgen Factories und Seeder dafür, dass Tests realistisch bleiben, ohne dass Fixtures manuell geschrieben werden müssen.

Blade: Templating ohne Überraschungen

Blade wird in reines PHP kompiliert und hält sich im Hintergrund. Die Ausgabe wird standardmäßig escaped, während Layouts und Komponenten dafür sorgen, dass das Markup DRY bleibt.

{{-- resources/views/posts/show.blade.php --}}
@extends('layouts.app')

@section('content')
    <article>
        <h1>{{ $post->title }}</h1>
        <p>By {{ $post->author->name }}</p>
        {!! $post->body !!}
    </article>
@endsection

{{ }} escaped, {!! !!} hingegen nicht. Verwenden Sie überall die escaped Form, es sei denn, Sie haben den Inhalt selbst bereinigt, und bevorzugen Sie Komponenten wie <x-post-card :post="$post" /> für wiederverwendbare UI-Elemente.

Validierung und Form Requests

Die Validierung ist ein First-Class-Feature. Sobald eine Validierung öfter benötigt wird, sollten die Regeln in einen Form Request ausgelagert werden.

php artisan make:request StorePostRequest
class StorePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return $this->user() !== null;
    }

    public function rules(): array
    {
        return [
            'title' => ['required', 'string', 'max:255'],
            'body' => ['required', 'string'],
            'published_at' => ['nullable', 'date'],
        ];
    }
}

Nutzen Sie Type-Hinting für den Request im Controller; Laravel führt die Validierung dann aus, bevor Ihr Code ausgeführt wird, und gibt bei Fehlern automatisch eine 422 zurück. Verwenden Sie anschließend $request->validated(), damit nur bekannte Felder das Model erreichen.

Middleware und der Request-Lifecycle

Middleware filtern Requests, bevor diese eine Route erreichen. In aktuellen Laravel-Versionen werden sie in bootstrap/app.php konfiguriert.

->withMiddleware(function (Middleware $middleware) {
    $middleware->api(prepend: [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    ]);

    $middleware->alias([
        'admin' => \App\Http\Middleware\EnsureUserIsAdmin::class,
    ]);
})

Ein Request durchläuft zuerst die globalen Middleware, dann die Route-Middleware wie auth und schließlich den Controller. Das Verständnis dieser Reihenfolge beantwortet die meisten Fragen der Art „Warum fehlt dieser Wert?“.

Der Service Container und Facades

Der Service Container löst Abhängigkeiten für dich auf. Gib einfach den Typ einer Klasse in einem Konstruktor oder Controller an und Laravel erstellt die Instanz und injiziert dabei rekursiv deren eigene Abhängigkeiten.

class PostController extends Controller
{
    public function __construct(private PostRepository $posts) {}
}

Facades wie Cache::get() und DB::table() bieten eine statisch wirkende Kurzschreibweise für Services im Container. Sie sind in Controllern praktisch, aber die Constructor Injection hält Klassen testbar und Abhängigkeiten explizit. Bevorzuge Injection in Services und nutze Facades dort, wo sie die Lesbarkeit tatsächlich verbessern.

Artisan, Queues und Events

Artisan ist die CLI, mit der die App generiert und ausgeführt wird.

php artisan make:model Post -mfc   # model, migration, factory, controller
php artisan migrate
php artisan queue:work
php artisan schedule:run

Alles, was langsam ist – das Versenden von E-Mails, das Aufrufen einer Drittanbieter-API, das Erstellen eines Berichts – gehört in einen queued job.

class SendPostNotification implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable;

    public function __construct(public Post $post) {}

    public function handle(): void
    {
        // runs on a worker, not in the request
    }
}

SendPostNotification::dispatch($post);

Events und Listener folgen demselben Muster, und Listener können ShouldQueue selbst implementieren, sodass die Anfrage sofort zurückgegeben wird.

Authentifizierung mit Sanctum

Für SPAs und tokenbasierte APIs ist Sanctum die Standardwahl. Es stellt personal access tokens aus und unterstützt zudem cookie-basierte Sessions für First-Party-Frontends.

$token = $user->createToken('mobile')->plainTextToken;

Schützen Sie Routen mit dem middleware Alias:

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Passport bleibt die richtige Option, wenn Sie einen vollständigen OAuth2-Server mit Clients, Scopes und Grants benötigen.

Testen mit Pest und PHPUnit

Laravel wird mit einem Testing-Setup ausgeliefert, das das Framework bootet und die Datenbank pro Test mithilfe des RefreshDatabase Traits zurücksetzen kann.

use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('it creates a post', function () {
    $user = User::factory()->create();

    $this->actingAs($user)
        ->postJson('/api/posts', ['title' => 'Hello', 'body' => 'World'])
        ->assertCreated();
});

Pest fügt eine gut lesbare, funktionsbasierte Syntax über PHPUnit hinzu. In beiden Fällen prüfen HTTP-Tests das Routing, die middleware, die Validierung und die Datenbank gemeinsam – denn genau dort verstecken sich die meisten Laravel-Bugs.

Best Practices

  • Halten Sie Controller schlank; verschieben Sie die Business-Logik in Services und Actions.
  • Nutzen Sie Form Requests für die Validierung und persistieren Sie nur $request->validated().
  • Verwenden Sie with() für das Eager Loading von Beziehungen, um N+1-Queries zu vermeiden.
  • Versionieren Sie das Schema mit Migrations und generieren Sie Daten mit Factories.
  • Bevorzugen Sie in Services, die Sie testen möchten, Constructor Injection gegenüber Facades.
  • Setzen Sie langsame Prozesse in eine Queue, um Requests schnell zu halten.
  • Schreiben Sie Feature-Tests, die die HTTP-Layer und eine echte Datenbank prüfen.

Häufige Fehler

  • Aufruf von Post::create($request->all()) und damit das Aussetzen von Spalten für Mass Assignment.
  • Lazy Loading von Beziehungen innerhalb einer Schleife, was die Datenbank überlastet.
  • Platzierung von Queries, Validierungen und Business-Logik in einer einzigen, riesigen Controller-Methode.
  • Vergessen von $fillable und die anschließende Verwunderung darüber, warum Attribute stillschweigend verworfen werden.
  • Ausführung rechenintensiver Aufgaben synchron, anstatt einen Job zu dispatchen.
  • Bearbeiten einer alten Migration, nachdem diese bereits in der Production ausgeführt wurde.
  • Die Annahme, dass {{ }} und {!! !!} austauschbar sind.

Wie geht es weiter?

Laravel lehrt einen produktiven, meinungsstarken Weg zum Bau von Webanwendungen. Da ein Großteil seines Fundaments auf Symfony-Komponenten basiert, ist dieser Guide eine natürliche Ergänzung. Wenn Sie aus der JavaScript-Welt kommen, vergleichen Sie die Herangehensweise mit Express. Um die API zu entwerfen, die Ihre Routen bereitstellen, lesen Sie über REST und anschließend über OpenAPI für die Dokumentation.

In der Praxis

Vom Route zur Datenbank

Vier Dateien, die ein Feature von Ende zu Ende beschreiben: Endpunkt, Controller, Model und Schema.

routes/web.php
<?php

use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{post}', [PostController::class, 'show']);

Route::middleware('auth:sanctum')->group(function () {
    Route::post('/posts', [PostController::class, 'store']);
    Route::put('/posts/{post}', [PostController::class, 'update']);
});

Route Model Binding

Lass den Router den Datensatz auflösen und automatisch einen 404 ausgeben. Manuelle Lookups verteilen findOrFail-Aufrufe und Fehlerbehandlungen über jeden Controller.

Bevorzugt
Route::get('/posts/{post}', [PostController::class, 'show']);

public function show(Post $post)
{
    return $post;
}
Vermeiden
Route::get('/posts/{id}', function ($id) {
    $post = Post::findOrFail($id);
    return $post;
});

Befüllen eines Models

Nur validierte Felder sollten die Datenbank erreichen. Das Übergeben des gesamten Requests an create erlaubt es Clients, Spalten zu setzen, die du nie exponieren wolltest.

Bevorzugt
$post = $request->user()
    ->posts()
    ->create($request->validated());
Vermeiden
$post = Post::create($request->all());
// is_admin, user_id and more can be set by the client

Abwägungen

Ist Laravel das richtige PHP-Framework?

Laravel optimiert auf Entwicklerzufriedenheit und Liefergeschwindigkeit. Wisse, wo dieser Komfort Kosten verursacht.

Strengths

  • Du lieferst Features, kein Plumbing

    Auth, Queues, Mail, Storage, Benachrichtigungen und Scheduling sind First-Party. Ein Feature, das in einem nackten Stack eine Woche dauert, benötigt hier oft nur einen Tag.

  • Eloquent und Migrationen sind exzellent

    Beziehungen, Eager Loading, Factories und versionierte Schema-Änderungen machen die Datenarbeit lesbar und über jede Umgebung hinweg reproduzierbar.

  • Das Ökosystem ist in PHP unerreicht

    First-Party-Tools decken Hosting, Serverless, Admin-Panels, Zahlungen und reaktive UIs ab und teilen die Konventionen des Frameworks.

Trade-offs

  • Magie kann teure Queries verbergen

    Lazy-loaded Beziehungen verursachen N+1-Queries, wenn du kein Eager Loading nutzt. Facades und der Container machen Abhängigkeiten implizit, sofern man nicht bewusst vorgeht.

  • Zu schwer für winzige Services

    Eine vollständige Laravel-Installation ist viel Framework für eine kleine interne API. Für einen einzelnen Endpunkt könnte ein Micro-Framework besser passen.

  • Jährliche Major-Releases brauchen Aufmerksamkeit

    Laravel veröffentlicht fast jedes Jahr ein Major-Release. Upgrades verlaufen meist reibungslos, sind aber wiederkehrende Arbeit, die man planen statt ignorieren muss.

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, Laravel zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch Laravel — mit Quizzen und echtem Code, den Sie im Browser ausführen können.