Kapitel 2 von 9

Laravel-13-Tutorial #2: Routing, Parameter und benannte Routen

geprüft am 7 September 2026 · 5 Min.

Schnelle Antwort

Routen werden in routes/web.php mit Route::get('/chemin', [MonController::class, 'methode']) deklariert. Benenne sie mit ->name(), um deine Links über route('nom') zu bauen statt fest verdrahtet. Die String-Syntax 'Controller@methode' funktioniert seit Laravel 8 nicht mehr.

Am Ende dieses Kapitels, kannst du eine Adresse mit einem Controller verbinden, einen URL-Parameter auslesen, eine Route benennen und Laravel ein Modell für dich laden lassen.

Eine Route verbindet eine Adresse mit Code. Sie ist das Eingangstor jedes Requests: Laravel liest die angefragte URL, sucht die passende Route und führt aus, worauf sie zeigt. Dieses Kapitel zeigt die vier Formen, die diese Verbindung annimmt.

Die einfachste Route

Alle Routen der öffentlichen Site werden in routes/web.php deklariert. Das steht nach der Installation darin:

routes/web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Diese Route sagt: Wenn jemand / per GET anfragt, gib die View welcome zurück, also die Datei resources/views/welcome.blade.php.

Route::get() nimmt zwei Argumente: die Adresse und das, was zu tun ist. Dieses zweite Argument kann mehrere Formen annehmen.

Einen String zurückgeben

routes/web.php
Route::get('/bonjour', function () {
    return 'Bonjour !';
});

Ruf http://127.0.0.1:8000/bonjour auf: Der Browser zeigt den reinen Text an. Das taugt, um zu prüfen, ob eine Route überhaupt erreicht wird, darüber hinaus selten.

Eine View zurückgeben

Um zu prüfen, dass welcome wirklich die View der Startseite ist, öffne resources/views/welcome.blade.php und füg irgendwo im <body> eine sichtbare Zeile ein:

resources/views/welcome.blade.php
<h1>Bonjour tout le monde !</h1>

Lad die Startseite neu: Die Überschrift erscheint. Du hast gerade eine View geändert, ohne die Route anzufassen.

Einen Controller zurückgeben

In einem echten Projekt steckt die Logik nicht in der Routendatei, sondern in einem Controller. Die Route benennt dann nur noch eine Klasse und eine Methode:

routes/web.php
use App\Http\Controllers\PostController;

Route::get('/article', [PostController::class, 'show']);

Das Array [PostController::class, 'show'] bedeutet „ruf die Methode show der Klasse PostController auf“. Den Controller gibt es noch nicht: Das nächste Kapitel legt ihn an. Achte auf das use am Dateianfang, das die Klasse importiert. Ohne es sucht PHP PostController im globalen Namespace und findet ihn nicht.

Die String-Syntax gibt es nicht mehr

Viele Tutorials für Laravel 7 und älter nutzen Route::get('/article', 'PostController@show'). Das automatische Namespace-Präfix, das diese Form möglich machte, wurde in Laravel 8 entfernt. Unter Laravel 13 scheitert sie mit dieser Meldung:

code
Illuminate\Contracts\Container\BindingResolutionException
Target class [PostController] does not exist.

Laravel sucht die Klasse in der Wurzel des Namespace statt in App\Http\Controllers. Nimm immer die Form mit dem Array.

Die URL-Parameter

Ein Blog braucht variable Adressen: /article/mon-premier-article, /article/un-autre. Der Teil, der sich ändert, wird zum Parameter und steht in geschweiften Klammern:

routes/web.php
Route::get('/article/{slug}', function (string $slug) {
    return "Vous avez demandé l'article : {$slug}";
});

Laravel fängt alles ab, was auf /article/ folgt, und übergibt es der Funktion unter dem Namen $slug. Der Name des Parameters in der URL und der Name des Arguments müssen übereinstimmen.

Du kannst die erwartete Form einschränken. Hier antwortet die Route nur, wenn der Bezeichner numerisch ist:

routes/web.php
Route::get('/article/{id}', function (int $id) {
    return "Article numéro {$id}";
})->whereNumber('id');

Eine URL wie /article/bonjour gibt dann einen 404-Fehler zurück, statt mit einem unerwarteten Wert in deinem Code zu landen.

Die benannten Routen

URLs fest in die Templates zu schreiben ist brüchig: An dem Tag, an dem du /article/ in /blog/ umbenennst, musst du jeden einzelnen Link wiederfinden. Ein Name für die Route löst das Problem:

routes/web.php
Route::get('/article/{slug}', [PostController::class, 'show'])->name('post');

Der Link entsteht dann aus dem Namen, nie aus der Adresse:

php
route('post', ['slug' => 'mon-premier-article'])
// http://127.0.0.1:8000/article/mon-premier-article

In einer Blade-View sieht das so aus:

markup
<a href="http://%20route('post',%20$post)%20">{{ $post->title }}</a>

Änder die Adresse in web.php, und alle Links ziehen mit. Genau so baut dieses Tutorial ab Kapitel 7 sämtliche Links.

Das Route Model Binding

Laravel kann noch mehr. Trägt der Parameter den Namen eines Modells, holt das Framework den Datensatz von selbst:

routes/web.php
use App\Models\Post;

Route::get('/article/{post}', function (Post $post) {
    return $post->title;
});

Laravel liest das URL-Segment, fragt die Tabelle posts ab und gibt automatisch einen 404-Fehler zurück, wenn nichts passt. Du bekommst direkt das Objekt, ohne die Abfrage zu schreiben. Standardmäßig wird über die Spalte id gesucht; Kapitel 6 zeigt, wie du sie stattdessen den slug nehmen lässt.

Dieses Model Binding spart die Hälfte des üblichen Controller-Codes. Es kommt im weiteren Verlauf des Tutorials überall zum Einsatz.

Die anderen HTTP-Verben

Route::get() beantwortet lesende Requests. Für Formulare und APIs stellt Laravel die übrigen Methoden bereit:

php
Route::post('/article', [PostController::class, 'store']);
Route::put('/article/{post}', [PostController::class, 'update']);
Route::delete('/article/{post}', [PostController::class, 'destroy']);

Dieses Tutorial nutzt nur get: Die Schreibvorgänge laufen über das Admin-Panel, das in Kapitel 4 installiert wird.

Alle Routen ansehen

Dieser Befehl listet auf, was deine Anwendung ausliefern kann:

bash
php artisan route:list --except-vendor

Im fertigen Projekt dieses Tutorials zeigt er nach der Installation des Admin-Panels aus Kapitel 4 auch die Routen des Back-Office an: Sie werden von Klassen in Ihrem Ordner app/Filament deklariert, nicht vom Paket selbst. Um nur die Seiten der Website zu sehen, fügen Sie --except-path=admin hinzu:

bash
php artisan route:list --except-vendor --except-path=admin
code
  GET|HEAD       / .................................... home › IndexController
  GET|HEAD       article/{post} ................... post › PostController@show
  GET|HEAD       categorie/{category} .......... category › CategoryController
  GET|HEAD       etiquette/{tag} ......................... tag › TagController
  GET|HEAD       recherche .................... search › PostController@search

Die Option --except-vendor blendet die von installierten Paketen hinzugefügten Routen aus, --except-path=admin lässt die des Admin-Panels weg, die durchaus Ihre eigenen sind. Es ist der erste Befehl, den man ausführt, wenn eine Adresse 404 liefert, obwohl man sie deklariert zu haben glaubte.

Das nächste Kapitel legt die Controller und die Views an, auf die diese Routen zeigen.

Häufige Fehler

Target class [MonController] does not exist Die Syntax 'MonController@methode' wird seit Laravel 8 nicht mehr unterstützt: Laravel sucht die Klasse in der Wurzel des Namespace. Nimm die Form [MonController::class, 'methode'] mit dem passenden use.
Eine feste Route wird von einer Route mit Parameter abgefangen Laravel hält bei der ersten passenden Route an. Deklariere /recherche vor /{slug}, sonst fängt die zweite die erste ab.
Eine deklarierte Route liefert trotzdem 404 Starte php artisan route:list --except-vendor, um zu sehen, was die Anwendung tatsächlich ausliefern kann.
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.