Zum Hauptinhalt springen

Was ist Validierung

Validierung bedeutet, zu prüfen, ob vom Nutzer übermittelte Daten das erwartete Format und die Bedingungen erfüllen. Laravel bietet dafür die einfache, aber leistungsfähige validate-Methode am Request-Objekt sowie eigene Form-Request-Klassen.

Validierung im Controller

Nutzung von $request->validate()

Der einfachste Weg ist der Aufruf von $request->validate() im Controller. Schlägt die Validierung fehl, leitet Laravel automatisch zurück und speichert die Fehler in der Session. Routen:
use App\Http\Controllers\PostController;

Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);
Controller:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class PostController extends Controller
{
    public function create(): View
    {
        return view('post.create');
    }

    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'body'  => 'required|string',
            'email' => 'required|email',
        ]);

        // Mit den validierten Daten speichern...

        return redirect('/posts');
    }
}
validate erwartet ein Array aus Feldname → Regel. Regeln trennen Sie per Pipe | oder in einem Array.
// Pipe
'title' => 'required|string|max:255',

// Array
'title' => ['required', 'string', 'max:255'],

Wichtige Validierungsregeln

RegelBedeutung
requiredWert existiert und ist nicht leer
stringString
emailGültige E-Mail
min:WertLänge oder Zahl mindestens angegebener Wert
max:WertLänge oder Zahl höchstens angegebener Wert
unique:tabelleWert in der Tabelle einzigartig
nullablenull ist erlaubt
integerGanzzahl
booleanBoolean (true/false, 1/0 etc.)
dateGültiges Datumsformat
confirmedMuss mit feldname_confirmation übereinstimmen
Alle Regeln finden Sie in der offiziellen Dokumentation.

Nutzung der validierten Daten

Der Rückgabewert von validate enthält ausschließlich die validierten Werte – vertrauenswürdig zur Weiterverarbeitung.
$validated = $request->validate([
    'title' => 'required|string|max:255',
    'body'  => 'required|string',
]);

// $validated ist ['title' => '...', 'body' => '...']
Post::create($validated);

Fehleranzeige in Blade

Nach einer fehlgeschlagenen Validierung stellt Laravel automatisch die Variable $errors in allen Views zur Verfügung. Dafür sorgt die Middleware ShareErrorsFromSession aus der web-Gruppe.

Alle Fehler auflisten

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

Fehler pro Feld

Mit @error zeigen Sie inline Fehler eines bestimmten Feldes.
<label for="title">Titel</label>

<input
    id="title"
    type="text"
    name="title"
    value="{{ old('title') }}"
    class="@error('title') is-invalid @enderror"
/>

@error('title')
    <div class="error-message">{{ $message }}</div>
@enderror
Mit old('feldname') behalten Sie den zuvor eingegebenen Wert im Formular auch nach einem Fehler.

Form Requests

Was sind Form Requests

Wenn die Validierungslogik komplexer wird, verlagern Sie sie in eine „Form-Request”-Klasse. Ein Form Request bündelt Validierungs- und Autorisierungslogik in einer eigenen Request-Klasse.

Form Request erzeugen

Mit make:request:
php artisan make:request StorePostRequest
Erzeugt app/Http/Requests/StorePostRequest.php:
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * Prüft, ob der Nutzer diese Aktion ausführen darf
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Regeln für diesen Request
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'title' => 'required|string|max:255',
            'body'  => 'required|string',
            'email' => 'required|email|unique:posts',
        ];
    }
}

rules()

Gibt die Regeln als Array zurück – gleiches Format wie beim validate-Aufruf.

authorize()

Prüft, ob der Nutzer diese Aktion ausführen darf. true = erlaubt, false = automatisches 403 Forbidden. Wollen Sie nur angemeldete Nutzer zulassen, prüfen Sie mit auth()->check(). Für Tutorials reicht true.
Gibt authorize() false zurück, wird die Controller-Methode nicht ausgeführt und ein 403 zurückgegeben.

Injection im Controller

Deklarieren Sie den Form Request einfach als Parameter. Die Validierung läuft vor der Methodenausführung.
use App\Http\Requests\StorePostRequest;

class PostController extends Controller
{
    public function store(StorePostRequest $request): RedirectResponse
    {
        // Kommt der Code hier an, ist alles validiert

        $validated = $request->validated();

        Post::create($validated);

        return redirect('/posts');
    }
}
$request->validated() liefert nur die validierten Daten.

Praxisbeispiel: Post-Formular anlegen und speichern

Kompletter Ablauf: Formular anzeigen, absenden, validieren, speichern.
1

Routen definieren

use App\Http\Controllers\PostController;

Route::get('/posts/create', [PostController::class, 'create']);
Route::post('/posts', [PostController::class, 'store']);
2

Form Request erzeugen

php artisan make:request StorePostRequest
public function rules(): array
{
    return [
        'title' => 'required|string|max:255',
        'body'  => 'required|string',
    ];
}

public function authorize(): bool
{
    return true;
}
3

Controller implementieren

use App\Http\Requests\StorePostRequest;
use App\Models\Post;

class PostController extends Controller
{
    public function create(): View
    {
        return view('posts.create');
    }

    public function store(StorePostRequest $request): RedirectResponse
    {
        Post::create($request->validated());

        return redirect('/posts');
    }
}
4

Blade-Template anlegen

{{-- resources/views/posts/create.blade.php --}}

<h1>Neuer Beitrag</h1>

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

<form method="POST" action="/posts">
    @csrf

    <div>
        <label for="title">Titel</label>
        <input
            id="title"
            type="text"
            name="title"
            value="{{ old('title') }}"
        />
        @error('title')
            <span>{{ $message }}</span>
        @enderror
    </div>

    <div>
        <label for="body">Inhalt</label>
        <textarea id="body" name="body">{{ old('body') }}</textarea>
        @error('body')
            <span>{{ $message }}</span>
        @enderror
    </div>

    <button type="submit">Absenden</button>
</form>
Vergessen Sie in Blade-Formularen nicht das @csrf-Directive – ohne CSRF-Token liefert Laravel Status 419.

Nächste Schritte

HTTP-Requests

Frischen Sie das Abrufen von Daten aus dem Request-Objekt auf.
Zuletzt geändert am 13. Juli 2026