Introduzione al Routing in Laravel
Benvenuti alla sesta lezione del nostro corso "Impara Laravel in 50 lezioni". In questa lezione ci immergeremo in uno dei pilastri fondamentali di ogni framework MVC (Model-View-Controller): il Routing.
In termini semplici, il routing è il meccanismo che permette all'applicazione di ricevere una richiesta HTTP da un client (come un browser web) e decidere quale parte del codice deve gestire tale richiesta. Immaginate il router come un vigile urbano che smista il traffico: quando un utente digita www.tuosito.it/contatti, il router intercetta l'URL /contatti e dice al sistema: "Ehi, per questa richiesta devi eseguire questa specifica funzione e mostrare questa pagina".
In Laravel, la gestione delle rotte è estremamente intuitiva e flessibile. La maggior parte delle rotte destinate all'interfaccia utente web si trova in un unico file: routes/web.php. In questo articolo vedremo come definire le rotte, come restituire risposte semplici e come iniziare a organizzare l'architettura della vostra applicazione.
Anatomia del file routes/web.php
Se aprite la cartella del vostro progetto Laravel, troverete una directory chiamata routes. All'interno di questa, noterete diversi file, tra cui web.php, api.php e console.php.
Perché web.php?
Il file web.php è dedicato alle rotte che vengono accedute tramite un browser. Questo significa che queste rotte godono di funzionalità specifiche che non sono presenti, ad esempio, nelle rotte API. Tra queste troviamo:
- Gestione della Sessione: Laravel permette di mantenere lo stato dell'utente tra una pagina e l'altra.
- Protezione CSRF (Cross-Site Request Forgery): Un sistema di sicurezza integrato che impedisce a malintenzionati di inviare richieste non autorizzate a nome dell'utente.
- Cookie: Gestione semplificata dei cookie del browser.
Quando scriviamo una rotta in web.php, stiamo utilizzando la Facade Route, che fornisce un'interfaccia statica per definire i percorsi dell'applicazione.
Definire le prime rotte: Metodi e Chiusure
Il modo più semplice per definire una rotta è associare un URL a una funzione anonima, chiamata in PHP "Closure".
Rotte di base
Vediamo come creare una rotta che restituisce una semplice stringa di testo. Questo è utile per testare rapidamente se il routing sta funzionando.
<?php
use Illuminate\\Support\\Facades\\Route;
// Questa rotta risponde all'URL radice (homepage)
Route::get('/', function () {
return 'Benvenuti nella mia applicazione Laravel!';
});
// Questa rotta risponde all'URL /chi-siamo
Route::get('/chi-siamo', function () {
return 'Siamo un team di sviluppatori appassionati di web!';
});
Spiegazione del codice:
Route::get(): Indica che la rotta risponde solo a richieste di tipo HTTP GET (quelle tipiche della navigazione via browser).'/chi-siamo': È l'URI (Uniform Resource Identifier). È la parte dell'URL che viene digitata dopo il dominio.function () { ... }: È la Closure. Tutto il codice contenuto tra le parentesi graffe verrà eseguito quando l'utente visiterà l'URL specificato.return: In Laravel, qualsiasi valore restituito da una rotta viene automaticamente convertito in una risposta HTTP valida.
Rotte con Parametri
Molto spesso, le rotte non sono statiche. Immaginate di avere un blog: non creerete una rotta per ogni singolo articolo (/articolo-1, /articolo-2, ecc.), ma creerete una rotta dinamica capace di accettare un parametro.
Parametri Obbligatori
Per definire un parametro, si utilizzano le parentesi graffe {} all'interno dell'URI.
<?php
use Illuminate\\Support\\Facades\\Route;
// Rotta con parametro obbligatorio 'id'
Route::get('/utente/{id}', function ($id) {
return 'Stai visualizzando il profilo dell\\'utente con ID: ' . $id;
});
In questo esempio, se l'utente visita /utente/5, la variabile $id all'interno della funzione assumerà il valore 5. Se l'utente tenta di accedere a /utente/ (senza ID), Laravel restituirà un errore 404 perché il parametro è obbligatorio.
Parametri Opzionali
Cosa succede se vogliamo che un parametro sia facoltativo? In questo caso, aggiungiamo un punto interrogativo ? dopo il nome del parametro e definiamo un valore di default nell'argomento della funzione.
<?php
use Illuminate\\Support\\Facades\\Route;
// Rotta con parametro opzionale
Route::get('/saluto/{nome?}', function ($nome = 'Ospite') {
return 'Ciao ' . $nome . ', benvenuto nel sito!';
});
Se l'utente visita /saluto/Mario, vedrà "Ciao Mario". Se visita semplicemente /saluto, vedrà "Ciao Ospite".
Collegare le Rotte alle Viste (Views)
Restituire stringhe di testo è utile per il debug, ma in un'applicazione reale vogliamo mostrare pagine HTML complete. Laravel utilizza il motore di template Blade per gestire le viste.
Invece di scrivere una Closure complessa, possiamo usare il metodo Route::view(). Questo metodo è una scorciatoia per le rotte che devono solo mostrare una pagina statica senza logica di business complicata.
<?php
use Illuminate\\Support\\Facades\\Route;
// Restituisce la vista 'welcome.blade.php' situata in resources/views
Route::view('/home', 'home');
// Restituisce la vista 'contatti' passando dei dati
Route::get('/contatti', function () {
return view('contatti', ['email' => 'info@esempio.com']);
});
Perché usare view()?
Separare la logica di routing dalla presentazione (HTML) è fondamentale per mantenere il codice pulito. Il file routes/web.php deve occuparsi solo di dove andare, mentre i file in resources/views si occupano di come apparire.
Esempi Pratici: Casi d'Uso Reali
Vediamo come implementare un piccolo sistema di navigazione per un sito aziendale.
Caso 1: Pagina Servizi con Categoria
Supponiamo di voler mostrare i servizi offerti in base a una categoria (es. Web Design, SEO, Marketing).
Route::get('/servizi/{categoria}', function ($categoria) {
// In un caso reale, qui interrogheremmo il database
return "Stai esplorando i nostri servizi di: " . ucfirst($categoria);
});
Caso 2: Pagina di Profilo Utente
Un profilo utente che richiede sia l'ID che un nome per scopi di SEO (slug).
Route::get('/profilo/{id}/{username}', function ($id, $username) {
return "Profilo ID: $id - Nome Utente: $username";
});
Errori Comuni e FAQ
1. Errore 404 nonostante la rotta esista
Causa: Spesso accade quando si dimentica di salvare il file web.php o quando c'è un errore di battitura nell'URL.
Soluzione: Verificate l'URL digitato e assicuratevi che non ci siano spazi superflui. Potete usare il comando php artisan route:list nel terminale per vedere l'elenco completo di tutte le rotte registrate nell'app.
2. Conflitto tra rotte
Problema: Se definisco Route::get('/{id}', ...) e poi Route::get('/contatti', ...), Laravel potrebbe interpretare "contatti" come se fosse un ID.
Soluzione: L'ordine delle rotte è fondamentale. Definite sempre le rotte statiche (come /contatti) prima di quelle con parametri dinamici (/{id}).
3. Metodo NotAllowedHttpException
Problema: Accedere a una rotta definita come Route::post() tramite il browser (che effettua richieste GET).
Soluzione: Assicuratevi che il metodo HTTP coincida con l'azione. Per la navigazione semplice, usate sempre Route::get().
Prossimi Passi
Ora che avete imparato le basi del routing in web.php, sapete come mappare gli URL della vostra applicazione e gestire parametri dinamici. Tuttavia, scrivere tutta la logica all'interno di Closure in web.php porterebbe a un file enorme e ingestibile.
Nella prossima lezione, scopriremo i Controller. Impareremo come spostare la logica dalle Closure a classi dedicate, rendendo l'applicazione scalabile, organizzata e professionale.
Risorse consigliate per approfondire:
- Documentazione ufficiale di Laravel (sezione Routing).
- Esercitazione: Provate a creare un piccolo sito con 5 pagine diverse, includendo almeno due rotte con parametri opzionali.
- Studio: Leggete la differenza tra i metodi HTTP GET, POST, PUT e DELETE.