Cos'è il routing
I framework moderni per la realizzazione di applicazioni Web supportano il meccanismo del routing, un termine con il quale ci si riferisce alla gestione delle URL e il mapping tra esse e le funzionalità offerte dall'applicazione stessa. Nonostante possa sembrare una tematica di scarso interesse, avere delle URL ben formattate, leggibili e ricche di informazioni è un aspetto fondamentale per il SEO.
Google e gli altri motori di ricerca premiano quei siti che offrono una navigazione parlante e, al contrario, svantaggiano i siti con URL dinamiche caratterizzate da parecchi parametri in querystring. La tendenza attuale è quella di spostare i parametri dalla querystring all'URL stesso. Per esempio un URL di questo tipo:
http://www.sito.it/post.php?idPost=1234
Potrebbe essere tradotto in:
http://www.sito.it/post/1234
o meglio ancora in
http://www.sito.it/post/titolo-del-post-normalizzato/1234
Nonostante questa opera di conversione possa sembrare complicata, utilizzando Laravel e il suo modulo di routing saranno sufficienti delle semplici operazioni.
Il file routes.php e le prime rotte di base
Per convenzione, le rotte di una applicazione Laravel sono definite all'interno del file app/Http/routes.php
utilizzando il facade Route, automaticamente reso disponibile dal framework in questo file. Tale oggetto espone dei metodi che condividono il loro nome con i metodi HTTP standard (GET, POST, PUT, DELETE..) in modo da poter identificare non solo la URL ma anche il metodo che il client deve utilizzare per poter scatenare la funzionalità. Ecco alcuni esempi:
Route::get('/', function() {
return 'Hello World';
});
Route::post('/post-url', function() {
return 'Post is a beautiful method';
});
Nel caso fosse necessario mappare alcune URL su più di un metodo, possiamo usare i metodi match
o any
:
Route::match(['get', 'post'], '/', function() {
return 'This is a GET or POST request';
});
Route::any('/any', function() {
return 'I can respond to any http method';
});
Nonostante i form HTML non possano utilizzare metodi diversi da GET e POST, è comunque possibile invocare anche gli altri metodi utilizzando il parametro speciale _method
.
Rotte parametriche e constraint
Una delle funzionalità più comode del modulo di routing di Laravel, è la possibilità di definire rotte parametriche esattamente come descritto nell'introduzione. Possiamo infatti scrivere:
Route::get('/post/{id}', function($id) {
return "You requested post with ID = " . $id;
});
o, nel caso di parametri opzionali:
Route::get('/post/{id?}, function($id = 1) {
return "You requested post with ID = " . $id;
});
Oltre ai parametri è impossibile impostare delle espressioni regolari di validazione sui parametri:
Route::get('/post/{id?}, function($id = 1) {
return "You requested post with ID = " . $id;
})->where(['id' => '[0-9]+']);
Dare un nome alle rotte
Le applicazioni di una certa complessità richiedono un elevato numero di rotte. Per non perdersi tra tutte queste configurazioni è possibile dare un nome alle rotte in modo da poterle riutilizzare facilmente anche all'interno di altri componenti, come per esempio nelle viste.
Route::get('/post/{id?}, ['postDetail', function($id = 1) {
[...]
}]);
Grazie alla funzione di utilità route
è possibile infine recuperare una rotta senza la necessità di scriverla e mantenendo intatto il pattern DRY (Don't Repeat Yourself).
$route = route('postDetail', ['id' => 1]);
I gruppi di rotte
Spesso può capitare di dover impostare alcune configurazioni comuni a più rotte. Pensiamo eventualmente a prefissi di URL comuni o a meccanismi di localizzazione basati sulle URL. Laravel ci viene incontro grazie ai gruppi. Tramite questi ultimi è possibile "racchiudere" le rotte in uno o più insiemi configurabili; le configurazioni impostate a livello di gruppo saranno ovviamente rese disponibili a tutte le rotte presenti. In questo caso riusciamo a recuperare il terzo livello di un dominio per gestirne eventualmente la localizzazione.
Route::group(['domain' => '{locale}.site.com'], function () {
Route::get('user/{id}', function ($locale, $id) {
//
});
});
Oppure possiamo anteporre un prefisso a tutte le URL:
Route::group(['prefix' => 'admin'], function () {
Route::get('users', function () {
// Matches The "/admin/users" URL
});
});
Sono disponibili altre configurazioni a livello di gruppo (in particolare middleware e namespace), ma verranno introdotte successivamente, quando si parlerà degli altri componenti presenti in Laravel.
Biblios: le prime rotte e i primi test sull'applicazione
In questa seconda parte di implementazione della nostra applicazione denominata "Biblios" possiamo concentrarci sulle prime rotte. Al momento, dato che non abbiamo ancora introdotto i controller, definiremo temporaneamente la logica all'interno del file routes.php
.
Apriamo quindi il file e aggiungiamo:
Route::get('/', [ 'as' => 'home', function () { //nomino la rotta 'home'
return "Benvenuti in Biblios";
}]);
Route::get('/home', function () {
return redirect(route('home'));
});
Per poter testare le rotte, utilizziamo il server HTTP integrato in Laravel. Apriamo quindi una console e, partendo dalla root del progetto, digitiamo:
php artisan serve
(approfondiremo i comandi successivamente). Così facendo abbiamo avviato un server HTTP sulla porta 8000. Apriamo quindi il browser per navigare all'indirizzo
http://localhost:8000
In questo modo dovremmo visualizzare il nostro messaggio, mentre se puntiamo verso:
http://localhost:8000/home
dovremmo essere redirezionati sulla root del progetto.