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}