Zum Hauptinhalt springen

Was ist eine Response

Controller und Routen müssen dem Browser eine Antwort liefern. Laravel bietet einfache Wege, um Strings, Arrays, Views, Redirects, JSON und weitere Antwortformen zurückzugeben.

Einfache Antworten

String zurückgeben

Die einfachste Antwort ist ein String. Laravel wandelt ihn automatisch in eine HTTP-Antwort um.
Route::get('/', function () {
    return 'Hello World';
});

Array zurückgeben

Ein zurückgegebenes Array wird von Laravel automatisch in JSON umgewandelt.
Route::get('/users', function () {
    return [
        ['id' => 1, 'name' => 'Tanaka'],
        ['id' => 2, 'name' => 'Suzuki'],
    ];
});
Auch Eloquent-Modelle oder -Collections werden direkt in JSON konvertiert. Ein häufig genutztes Muster für einfache APIs.

Eloquent-Modell zurückgeben

use App\Models\User;

Route::get('/user/{user}', function (User $user) {
    return $user;
});

Das Response-Objekt

Mit dem Helper response() geben Sie detailliert HTTP-Status und Header vor.
Route::get('/home', function () {
    return response('Hello World', 200)
        ->header('Content-Type', 'text/plain');
});
Das erste Argument ist der Body, das zweite der HTTP-Status.

Häufig verwendete HTTP-Statuscodes

CodeBedeutung
200OK (Erfolg)
201Created (Ressource angelegt)
204No Content (kein Inhalt)
301Moved Permanently (dauerhafte Weiterleitung)
302Found (temporäre Weiterleitung)
404Not Found (nicht gefunden)
422Unprocessable Entity (Validierungsfehler)
500Internal Server Error (Server-Fehler)

View-Antwort

Um aus einem Controller eine Blade-View auszuliefern, verwenden Sie view(). Das ist die häufigste Antwort in Webanwendungen.
<?php

namespace App\Http\Controllers;

use Illuminate\View\View;

class HomeController extends Controller
{
    public function index(): View
    {
        $users = [
            ['name' => 'Tanaka', 'email' => '[email protected]'],
            ['name' => 'Suzuki', 'email' => '[email protected]'],
        ];

        return view('users.index', ['users' => $users]);
    }
}
Das erste Argument ist der View-Name, das zweite ein Array mit Daten.
Mit dem Return-Typ-Hint Illuminate\View\View machen Sie die Absicht Ihres Codes explizit.

Feineinstellung mit response()->view()

Möchten Sie auch Status und Header setzen, verwenden Sie response()->view().
return response()
    ->view('errors.404', ['message' => 'Seite nicht gefunden'], 404);

Redirects

Einfacher Redirect

redirect() liefert eine Redirect-Response. Häufig verwendet nach Formularübermittlungen.
use Illuminate\Http\RedirectResponse;

Route::get('/old-page', function (): RedirectResponse {
    return redirect('/new-page');
});
Beispiel im Controller:
<?php

namespace App\Http\Controllers;

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

class PostController extends Controller
{
    public function store(Request $request): RedirectResponse
    {
        // Post speichern...

        return redirect('/posts');
    }
}

Redirect zu einer benannten Route

Mit route() verweisen Sie über den Routennamen statt einer festen URL. Best Practice, da sich URLs so ändern können, ohne dass Code angepasst werden muss.
// Route benennen
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
// Redirect
return redirect()->route('posts.index');

// Mit Routenparametern
return redirect()->route('posts.show', ['post' => $post->id]);

Zurück zur vorherigen Seite

Mit back() gelangt der Nutzer zur vorherigen Seite zurück. Typisch nach fehlgeschlagener Validierung.
return back();

// Mit erhaltenen Eingaben
return back()->withInput();

Redirect mit Flash-Nachricht

Mit with() legen Sie eine Nachricht in die Session ab. Praktisch für Erfolgsmeldungen nach einer Formularsubmission.
return redirect('/posts')->with('success', 'Beitrag erstellt.');
Im Blade-Template zeigen Sie sie an:
@if (session('success'))
    <div class="alert alert-success">
        {{ session('success') }}
    </div>
@endif

JSON-Antworten

Für APIs verwenden Sie response()->json(). Der Header Content-Type: application/json wird automatisch gesetzt.
use Illuminate\Http\JsonResponse;

Route::get('/api/users', function (): JsonResponse {
    $users = [
        ['id' => 1, 'name' => 'Tanaka'],
        ['id' => 2, 'name' => 'Suzuki'],
    ];

    return response()->json($users);
});
Auch mit Statuscode:
return response()->json(['message' => 'Erstellt'], 201);
Im Controller:
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index(): JsonResponse
    {
        $users = User::all();

        return response()->json($users);
    }

    public function store(Request $request): JsonResponse
    {
        // Mit validierten Daten erstellen (nach Form Request oder $request->validate())
        $user = User::create($request->validated());

        return response()->json($user, 201);
    }
}
Auch das einfache Rückgeben eines Arrays oder Eloquent-Modells liefert JSON. response()->json() gibt Ihnen jedoch feine Kontrolle über Status und Header.

Response-Header

Header ergänzen Sie mit header().
return response('Hello World')
    ->header('Content-Type', 'text/plain')
    ->header('X-Custom-Header', 'MyValue');
Mehrere Header gleichzeitig setzen Sie mit withHeaders().
return response('Hello World')
    ->withHeaders([
        'Content-Type' => 'text/plain',
        'X-Custom-Header' => 'MyValue',
        'Cache-Control' => 'no-cache',
    ]);

Praxisbeispiel: Kombinationen im Controller

Ein Beispiel, das die typischen Response-Varianten in einem Controller kombiniert.
1

Routen definieren

use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/create', [PostController::class, 'create'])->name('posts.create');
Route::post('/posts', [PostController::class, 'store'])->name('posts.store');
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
Route::delete('/posts/{post}', [PostController::class, 'destroy'])->name('posts.destroy');
2

Controller implementieren

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class PostController extends Controller
{
    // Übersicht: View
    public function index(): View
    {
        $posts = Post::latest()->get();

        return view('posts.index', ['posts' => $posts]);
    }

    // Erstellungs-Formular: View
    public function create(): View
    {
        return view('posts.create');
    }

    // Speichern: Redirect
    public function store(Request $request): RedirectResponse
    {
        // Mit validierten Daten anlegen (falls Form Request)
        $post = Post::create($request->validated());

        return redirect()
            ->route('posts.show', ['post' => $post->id])
            ->with('success', 'Beitrag erstellt.');
    }

    // Detailseite: View
    public function show(Post $post): View
    {
        return view('posts.show', ['post' => $post]);
    }

    // Löschen: Redirect
    public function destroy(Post $post): RedirectResponse
    {
        $post->delete();

        return redirect()
            ->route('posts.index')
            ->with('success', 'Beitrag gelöscht.');
    }
}
In Web-Apps ist die klare Trennung zwischen View und RedirectResponse üblich. Anzeigen liefern View, verändernde Aktionen (Anlegen, Aktualisieren, Löschen) enden typischerweise mit einer RedirectResponse.

Nächste Schritte

Validierung

Erfahren Sie, wie Sie Eingaben validieren, bevor Sie eine Response ausliefern.
Zuletzt geändert am 13. Juli 2026