Come abbiamo visto nel capitolo precedente, i valori passati come parametri alle route potrebbero essere non validi o addirittura non sicuri. Qui entra in gioco la validazione dei parametri delle route, essenziale per diverse ragioni:
- integrità dei dati: verificare che i valori ricevuti siano nel formato corretto e non causino errori nell’applicazione
- sicurezza: prevenire attacchi come SQL injection
- user experience: fornire all’utente sempre dei feedback sensati quando inserisce dati non validi o esegue azioni non consentite
Come validare le route in Symfony? Semplice! Per validare i parametri è possibile utilizzare l’opzione requirements all’interno della definizione della route. I requirements sono composti da espressioni regolari che specificano per ogni singolo parametro quali sono i requisiti da soddisfare.
Per specificare nell’esempio precedente che il parametro max deve essere di tipo numerico, possiamo aggiungere l’opzione requirements alla definizione della route in questo modo:
#[Route('/hello/random/{max}', name: 'app_hello_random', requirements: ['max' => '\d+'])]
Come si nota, al parametro max è stata associata l’espressione regolare ‘\d+’ che accetta solo valori numerici. Se l’URL contiene un valore non numerico per il parametro max, Symfony non valuterà la route.
Proviamo a ricaricare l’URL symfony-test.local/hello/random/ciao
Come risultato non otterremo più un errore 500 ma un 404 not found in quanto la route con parametro testuale non è riconosciuta come registrata sul sistema.
L’opzione requirements può essere utilizzata inline per rendere la route più compatta. La sintassi da applicare ad ogni parametro è
{nome del parametro<requirements>}
La route precedente può essere modificata come segue:
#[Route('/hello/random/{max<\d+>}', name: 'app_hello_random')]
Debug delle route in Symfony
Una tipica web application sarà composta da un numero importante di route. Per semplificare la gestione ed il debug delle route presenti nell’applicazione, Symfony mette a disposizione un utile comando della console, che abbiamo già accennato brevemente nella sezione relativa ai controller:
php bin/console debug:router
Il comando debug fornisce in output l’elenco di tutte le route nello stesso ordine in cui vengono valutate da Symfony. Per ogni route vengono fornite le seguenti informazioni:
- Name: il nome univoco assegnato alla route
- Method: il metodo HTTP (o i metodi) da utilizzare per accedere alla route
- Scheme: il protocollo utilizzato per la route, ovvero http o https
- Host: indica l’host (o gli host) su cui la rotta è valida. Di default, la rotta è valida per qualsiasi host, ma Symfony permette di definire rotte specifiche per determinati domini o sottodomini.
- Path: il percorso sul quale è mappata la route
Lanciando il comando da terminale, possiamo visualizzare le route create nella classe controller HelloController che stiamo utilizzando in questa guida.
Per ogni singola route, inoltre, è possibile accedere a dettagli specifici. Ad esempio, esploriamo nel dettaglio la route app_hello_random:
php bin/console debug:router app_hello_random
In output avremo:
Oltre alle informazioni già ottenute con la lista delle route, con l’analisi di una singola route otteniamo anche delle utili informazioni riguardo la classe controller ed il metodo associati alla rotta, requisiti sui parametri ed eventuali opzioni aggiuntive configurate per la route.