04 Condizionare le rotte di laravel

Parametri

Vediamo come passare dei parametri all’ url in modo da rendere dinamica la risposta alla chiamata, per esempio, se chiamiamo l’url

http://localhost:8000/pippo

Non possiamo creare staticamente tutte le rotte, che magari cambiano nel tempo, la soluzione è quella di aggiungere un segnaposto delimitato da graffe dopo l’indirizzo specificato come uri del metodo get() nella nostra rotta

Route::get('/{nome}', function () {
 return 'Benvenuto ';
});

Quando la rotta trova una concordanza tra la richiesta e la rotta specificata, nel nostro caso uno slash seguito da una stringa, passerà la stringa trovata al parametro che andrò ad aggiungere alla funzione .

Route::get('/{nome}', function ($nome='') {
 return 'welcome '.$nome;
});

Per convenzione il parametro passato alla funzione viene chiamato come il nome del segnaposto. Da notare anche che ho attribuito un valore predefinito vuoto.

Se ora apriamo però l’url principale, verrà restituito un errore, perchè non viene trovato nulla dopo lo slash, pertanto dobbiamo dichiarare che il parametro è opzionale, inserendo un punto di domanda ( ? ) dopo il segnaposto

Route::get('/{nome?}', function ($nome='') {
 return 'welcome '.$nome;
});

Possiamo specificare ulteriori segmenti dell’url

http://localhost:8000/pippo/paperino

aggiungendo un secondo segnaposto e un ulteriore parametro alla funzione anonima

Route::get('/{nome?}/{cognome?}', function ($nome='',$cognome='') {
 return 'welcome '.$nome.' '.$cognome ;
});

sia pippo che paperino verranno catturati e passati ai rispettivi argomenti della funzione.

Tipizzare URL con le espressioni regolari

Con gli esempi fatti fino ad adesso, se noi apriamo l’url

http://localhost:8000/2/4

non vi è nessuna difficoltà per laravel a restituire il dato, perchè da nessuna parte abbiamo specificato il tipo di dato da processare.

Questo potrà essere fatto utilizzando il metodo where() che come primo parametro riceverà il nome del segnaposto da tipizzare e come secondo l’espressione che ne definisce il tipo tramite una regola

Route::get('/{nome?}/{cognome?}', function ($nome='',$cognome='') {
 return 'welcome '.$nome.' '.$cognome ;
})->where('nome','');

adesso costruiamo l’espressione regolare, per esempio se vogliamo che sia una stringa maiuscola/ minuscola con più caratteri

[a-zA-Z]+

quindi inserendolo nel secondo parametro del where() e verifichiamo che l’url numerico non si apre più

Route::get('/{nome?}/{cognome?}', function ($nome='',$cognome='') {
 return 'welcome '.$nome.' '.$cognome ;
})->where('nome','[a-zA-Z]+');

Se però apriamo questo url funzionerà

http://localhost:8000/pippo/4

un modo è concatenare un altro where() che agirà sul secondo segnaposto

Route::get('/{nome?}/{cognome?}', function ($nome='',$cognome='') {
 return 'welcome '.$nome.' '.$cognome ;
})
   ->where('nome','[a-zA-Z]+')
   ->where('cognome','[a-zA-Z]+');

La seconda possibilità che è quella migliore è di passare al metodo where un array di parametri

Route::get('/{nome?}/{cognome?}', function ($nome='',$cognome='') {
 return 'welcome '.$nome.' '.$cognome ;
})->where([
    'nome' => '[a-zA-Z]+',
    'cognome' => '[a-zA-Z]+'
]);

stessa cosa con un terzo parametro, supponiamo di aggiungere l’età

http://localhost:8000/pippo/paperino/12

a questo punto riceveremo l’errore, quindi aggiungiamo il nostro codice nella rotta con l’età che è di tipo number e va da 1 a 3 cifre

Route::get('/{nome?}/{cognome?}/{eta?}', function ($nome='',$cognome='',$eta=0) {
return 'welcome '.$nome.' '.$cognome. ' '. $eta;
})->where([
   'nome' => '[a-zA-Z]+',
   'cognome' => '[a-zA-Z]+',
   'eta' => '[0-9]{0,3}'
]);

Abbiamo aggiunto il terzo segnaposto eta , il parametro eta che di predefinito è zero e il terzo parametro where che un numero che va da 0 a 9 [0-9] con un massimo di 3 cifre {0,3}