Capitolo 2 di 9

Tutorial Laravel 13 #2: routing, parametri URL e rotte con nome

verificato il 7 Settembre 2026 · 5 min

Risposta rapida

Le rotte si dichiarano in routes/web.php con Route::get('/chemin', [MonController::class, 'methode']). Dai loro un nome con ->name() per costruire i link con route('nom') invece di scriverli a mano. La sintassi in stringa 'Controller@methode' non funziona più da Laravel 8.

Alla fine di questo capitolo, saprai collegare un indirizzo a un controller, leggere un parametro nell'URL, dare un nome a una rotta e lasciare che sia Laravel a caricare un modello al posto tuo.

Una rotta associa un indirizzo a del codice. È la porta d’ingresso di ogni richiesta: Laravel legge l’URL richiesto, cerca la rotta che corrisponde ed esegue quello che indica. Questo capitolo mostra le quattro forme che può prendere questa associazione.

La rotta più semplice

Tutte le rotte del sito pubblico si dichiarano in routes/web.php. Ecco il suo contenuto appena installato:

routes/web.php
<?php

use Illuminate\Support\Facades\Route;

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

Questa rotta dice: quando qualcuno chiede / con il metodo GET, restituisci la vista welcome, cioè il file resources/views/welcome.blade.php.

Route::get() prende due argomenti: l’indirizzo e quello che c’è da fare. Il secondo argomento può assumere forme diverse.

Restituire una stringa

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

Apri http://127.0.0.1:8000/bonjour: il browser mostra il testo così com’è. Serve a controllare che una rotta venga davvero raggiunta, raramente ad altro.

Restituire una vista

Per verificare che welcome sia davvero la vista mostrata sulla home, apri resources/views/welcome.blade.php e aggiungi una riga visibile in un punto qualsiasi del <body>:

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

Ricarica la home: il titolo compare. Hai appena modificato una vista senza toccare la rotta.

Puntare a un controller

In un progetto vero la logica non vive nel file delle rotte ma in un controller. La rotta si limita allora a indicare una classe e un metodo:

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

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

L’array [PostController::class, 'show'] significa « chiama il metodo show della classe PostController ». Il controller non esiste ancora: lo crea il capitolo successivo. Nota lo use in cima al file, che importa la classe. Senza, PHP cercherà PostController nel namespace globale e non lo troverà.

La sintassi in stringa non esiste più

Molti tutorial scritti per Laravel 7 o versioni precedenti usano Route::get('/article', 'PostController@show'). Il prefisso automatico di namespace che rendeva possibile questa forma è stato rimosso in Laravel 8. Su Laravel 13 fallisce con questo messaggio:

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

Laravel cerca la classe alla radice del namespace invece che in App\Http\Controllers. Usa sempre la forma con l’array.

I parametri nell’URL

Un blog ha bisogno di indirizzi variabili: /article/mon-premier-article, /article/un-autre. La parte che cambia diventa un parametro, scritto tra parentesi graffe:

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

Laravel cattura tutto quello che segue /article/ e lo passa alla funzione con il nome $slug. Il nome del parametro nell’URL e il nome dell’argomento devono coincidere.

Puoi vincolare la forma attesa. Qui la rotta risponde soltanto se l’identificativo è numerico:

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

Un URL come /article/bonjour restituirà allora un errore 404, invece di arrivare al tuo codice con un valore inatteso.

Le rotte con un nome

Scrivere gli URL a mano nei template è fragile: il giorno in cui rinomini /article/ in /blog/, devi ritrovare ogni singolo link. Dare un nome alla rotta risolve il problema:

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

Il link si costruisce allora a partire dal nome, mai dall’indirizzo:

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

In una vista Blade diventa:

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

Cambia l’indirizzo in web.php e tutti i link seguono. È così che questo tutorial costruisce tutti i suoi link a partire dal capitolo 7.

Il route model binding

Laravel sa andare oltre. Se il parametro porta il nome di un modello, è il framework stesso ad andare a prendere il record:

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

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

Laravel legge il segmento di URL, interroga la tabella posts e restituisce in automatico un errore 404 se non corrisponde niente. Ricevi direttamente l’oggetto, senza scrivere la query. Per impostazione predefinita la ricerca avviene sulla colonna id; il capitolo 6 mostra come chiedergli di usare lo slug.

Questo model binding fa risparmiare metà del codice che di solito si scrive in un controller. Nel resto del tutorial viene usato ovunque.

Gli altri verbi HTTP

Route::get() risponde alle richieste di lettura. Per i form e le API, Laravel espone gli altri metodi:

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

Questo tutorial usa solo get: le scritture passeranno dal pannello di amministrazione installato al capitolo 4.

Vedere tutte le rotte

Questo comando elenca quello che la tua applicazione sa servire:

bash
php artisan route:list --except-vendor

Sul progetto finito di questo tutorial, una volta installato il pannello di amministrazione del capitolo 4, mostra anche le rotte del back-office: sono dichiarate da classi della vostra cartella app/Filament, non dal pacchetto stesso. Per vedere solo le pagine del sito, aggiungete --except-path=admin:

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

L’opzione --except-vendor nasconde le rotte aggiunte dai pacchetti installati, --except-path=admin esclude quelle del pannello di amministrazione, che sono davvero vostre. È il primo comando da lanciare quando un indirizzo restituisce un 404 pur credendo di averlo dichiarato.

Il capitolo successivo crea i controller e le viste che queste rotte indicano.

Errori frequenti

Target class [MonController] does not exist La sintassi 'MonController@methode' non è più supportata da Laravel 8: Laravel cerca la classe alla radice del namespace. Usa la forma [MonController::class, 'methode'] con il relativo use.
Una rotta fissa catturata da una rotta con parametro Laravel si ferma alla prima rotta che corrisponde. Dichiara /recherche prima di /{slug}, altrimenti la seconda intercetta la prima.
Una rotta dichiarata restituisce comunque un 404 Lancia php artisan route:list --except-vendor per vedere che cosa l'applicazione sa davvero servire.
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.