Hoofdstuk 2 van 9

Laravel 13-tutorial #2: routing, parameters en named routes

geverifieerd op 7 september 2026 · 5 min

Kort antwoord

Routes declareer je in routes/web.php met Route::get('/chemin', [MonController::class, 'methode']). Geef ze een naam met ->name() zodat je je links via route('nom') opbouwt in plaats van hardcoded. De syntaxis met een string, 'Controller@methode', werkt niet meer sinds Laravel 8.

Aan het einde van dit hoofdstuk, kun je een adres aan een controller koppelen, een URL-parameter uitlezen, een route een naam geven en Laravel het model voor je laten ophalen.

Een route koppelt een adres aan code. Ze is de ingang van elke request: Laravel leest de gevraagde URL, zoekt de route die erbij past en voert uit waar die naar wijst. Dit hoofdstuk laat de vier vormen zien die zo’n koppeling aanneemt.

De eenvoudigste route

Alle routes van de publieke site declareer je in routes/web.php. Dit staat er meteen na de installatie in:

routes/web.php
<?php

use Illuminate\Support\Facades\Route;

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

Deze route zegt: vraagt iemand / op met de methode GET, geef dan de view welcome terug, oftewel het bestand resources/views/welcome.blade.php.

Route::get() krijgt twee argumenten: het adres, en wat er moet gebeuren. Dat tweede argument kan verschillende vormen aannemen.

Een string teruggeven

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

Ga naar http://127.0.0.1:8000/bonjour: de browser toont de kale tekst. Handig om te controleren of een route werkelijk wordt bereikt, zelden meer dan dat.

Een view teruggeven

Wil je nagaan dat welcome inderdaad de view is die op de homepage verschijnt, open dan resources/views/welcome.blade.php en zet ergens in de <body> een zichtbare regel:

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

Herlaad de homepage: de titel verschijnt. Je hebt zojuist een view aangepast, zonder de route aan te raken.

Naar een controller wijzen

In een echt project leeft de logica niet in het routebestand maar in een controller. De route wijst dan alleen nog een klasse en een methode aan:

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

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

De array [PostController::class, 'show'] betekent ‘roep de methode show van de klasse PostController aan’. Die controller bestaat nog niet: het volgende hoofdstuk maakt hem. Let op de use boven in het bestand, die de klasse importeert. Zonder die regel zoekt PHP PostController in de globale namespace en vindt hem daar niet.

De syntaxis met een string bestaat niet meer

Veel tutorials die voor Laravel 7 of eerder zijn geschreven, gebruiken Route::get('/article', 'PostController@show'). De automatische namespace-prefix die deze vorm mogelijk maakte, is in Laravel 8 verwijderd. Op Laravel 13 loopt ze stuk met deze melding:

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

Laravel zoekt de klasse in de root van de namespace in plaats van in App\Http\Controllers. Gebruik altijd de vorm met de array.

De URL-parameters

Een blog heeft variabele adressen nodig: /article/mon-premier-article, /article/un-autre. Het deel dat verandert wordt een parameter, geschreven tussen accolades:

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

Laravel vangt alles op wat achter /article/ komt en geeft het aan de functie door onder de naam $slug. De naam van de parameter in de URL en de naam van het argument moeten overeenkomen.

Je kunt de verwachte vorm afdwingen. Hier antwoordt de route alleen als de identifier numeriek is:

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

Een URL als /article/bonjour levert dan een 404 op, in plaats van je code te bereiken met een onverwachte waarde.

Named routes

URL’s hardcoderen in je templates is broos: hernoem je ooit /article/ naar /blog/, dan moet je elke link terugzoeken. De route een naam geven lost dat op:

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

De link bouw je dan op vanuit die naam, nooit vanuit het adres:

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

In een Blade-view ziet dat er zo uit:

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

Verander het adres in web.php en alle links gaan mee. Vanaf hoofdstuk 7 bouwt deze tutorial al zijn links op die manier.

Route model binding

Laravel kan nog een stap verder. Draagt de parameter de naam van een model, dan haalt het framework het record zelf op:

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

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

Laravel leest het URL-segment, bevraagt de tabel posts en geeft vanzelf een 404 terug als er niets bij past. Je krijgt het object rechtstreeks binnen, zonder de query te schrijven. Standaard zoekt hij op de kolom id; hoofdstuk 6 laat zien hoe je hem de slug laat gebruiken.

Die binding scheelt je de helft van de code die een controller gewoonlijk bevat. De rest van de tutorial gebruikt die overal.

De andere HTTP-methodes

Route::get() beantwoordt leesrequests. Voor formulieren en API’s biedt Laravel de andere methodes:

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

Deze tutorial gebruikt alleen get: het schrijfwerk loopt via het adminpaneel dat in hoofdstuk 4 wordt geïnstalleerd.

Alle routes bekijken

Dit commando somt op wat je applicatie kan serveren:

bash
php artisan route:list --except-vendor

In het afgeronde project van deze tutorial toont het, zodra het beheerpaneel uit hoofdstuk 4 is geïnstalleerd, ook de routes van de back-office: die worden gedeclareerd door klassen in je map app/Filament, niet door het pakket zelf. Om alleen de pagina’s van de site te zien, voeg je --except-path=admin toe:

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

De optie --except-vendor verbergt routes die door geïnstalleerde pakketten zijn toegevoegd, --except-path=admin laat die van het beheerpaneel weg, die wel degelijk van jou zijn. Het is het eerste commando om te draaien wanneer een adres een 404 geeft terwijl je dacht het gedeclareerd te hebben.

Het volgende hoofdstuk maakt de controllers en de views die deze routes aanwijzen.

Veelgemaakte fouten

Target class [MonController] does not exist De syntaxis 'MonController@methode' wordt sinds Laravel 8 niet meer ondersteund: Laravel zoekt de klasse in de root van de namespace. Gebruik de vorm [MonController::class, 'methode'] met de bijbehorende use.
Een vaste route wordt opgeslokt door een route met parameter Laravel stopt bij de eerste route die past. Declareer /recherche vóór /{slug}, anders onderschept de tweede de eerste.
Een gedeclareerde route geeft toch een 404 Draai php artisan route:list --except-vendor om te zien wat de applicatie werkelijk kan serveren.
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.