Tutorial Laravel 13 #2: routing, parametri URL e rotte con nome
verificato il 7 Settembre 2026 · 5 min
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.
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:
<?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
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>:
<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:
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à.
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:
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:
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:
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:
Route::get('/article/{slug}', [PostController::class, 'show'])->name('post');Il link si costruisce allora a partire dal nome, mai dall’indirizzo:
route('post', ['slug' => 'mon-premier-article'])
// http://127.0.0.1:8000/article/mon-premier-articleIn una vista Blade diventa:
<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:
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:
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:
php artisan route:list --except-vendorSul 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:
php artisan route:list --except-vendor --except-path=admin 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@searchL’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.