Laravel e la validazione di un form - Form Request Validation


laravel-e-la-validazione-di-un-form-form-request-validation

Nel precedente tutorial hai visto come realizzare un form e validarne i dati: i dati sono affidati all'istanza del Validator e c'è una strategia sia nel caso la validazione abbia successo, sia che non ce l'abbia.
C'è modo di perfezionare e snellire il codice, però: usando la Form Request Validation.

La validazione

Faccio un passo indietro.
Ricordi questa parte di codice?

$validazione = Validator::make($request->all(), $regole);

Qui usi la classe Validator per validare i dati, ma Laravel mette a disposizione un metodo, validate(), in ogni controller che puoi usare per sfruttare qualche automatismo.
Tecnicamente funziona così: la classe App\Http\Controllers\Controller usa il trait ValidatesRequests nel quale c'è il metodo validate().
Dato che ogni controller che crei estende quella classe, eredita il metodo.

In dettaglio, il metodo validate(), al suo interno, gestisce il fallimento della validazione lanciando un'eccezione:

if ($validator->fails()) {
    $this->throwValidationException($request, $validator);
}

L'eccezione ritorna alla pagina precedente con gli errori e gli input.
Perciò, il metodo inviaDati() puoi riscriverlo così:

public function inviaDati(Request $request)
{	
    $regole = [
    	'nome'      => 'required|alpha|min:2',
    	'cognome'   => 'required|alpha|min:2',
    	'email'     => ‘required|email'
	];
	$this->validate($request, $regole);

	// codice per il caso della validazione superata 
}

Il metodo validate() viene ereditato dalla classe padre, per cui lo richiami con il $this.
Se le cose vanno male, senza dover scrivere altro, l'eccezione lanciata si occupa di fare il redirect alla pagina precedente; in caso contrario, viene eseguito il codice per la validazione superata.

Traduzione messaggi

Gli errori visualizzati li puoi trovare in resources/lang/en/validation.php: sono ovviamente in inglese, per cui è molto probabile che vorrai tradurli quanto meno in italiano.
Fai così:

  • vai su github e clona il repository caouecs/Laravel-lang
  • copia la cartella it in resources/lang/
  • in config/app.php imposta la variabile locale da en a it

A questo punto i messaggi sono in italiano.
Ma se volessi messaggi di errore personalizzati?

Messaggi personalizzati

Con Laravel c'è la possibilità di impostare i messaggi per ogni validazione, ed è anche molto semplice.
Osserva le due funzioni che abbiamo già visto:

$validazione = Validator::make($request->all(), $regole);
---
$this->validate($request, $regole);

Come puoi notare, i due metodi di validazione prendono 2 parametri, i dati nell'oggetto $request e l'array con le regole di validazione.
In entrambi, puoi passare anche un terzo parametro, un array, contenente i messaggi da visualizzare per ogni errore presente nelle regole.
Ad esempio, per la regole che hai in $regole, puoi creare il seguente array:

$regole = [
    'nome'      => 'required|alpha|min:2',
    'cognome'   => 'required|alpha|min:2',
    'email'     => ‘required|email'
];
$messaggi = [
	'required'	=>  'Il campo :attribute è necessario',
	'alpha'		=>	'Il :attribute dev'essere composto da sole lettere',
	'min'		=>	'Il :attribute dev'essere composto da minimo :min caratteri',
	'email'		=>	'L\'email deve avere il formato nome@dominio.tld'
];

E quindi

$validazione = Validator::make($request->all(), $regole, $messaggi);
---
$this->validate($request, $regole, $messaggi);

Tieni a mente che hai la possibilità anche di essere più preciso nel definire un messaggio, indicando il campo e la singola regola a cui si applica, ad esempio:

	...
	'nome.required'	=> 'è necessario compilare il campo nome',
	...

Hai tutti gli strumenti per personalizzare la validazione come preferisci.

Form Request Validation

Laravel ti offre anche un altro strumento per effettuare la validazione.
La Form Request Validation, è una classe personalizzata che estende la classe Request (quella che abbiamo usato come dipendenza nel metodo inviaDati()).

Per crearne una puoi usare artisan:

artisan make:request ContattiRequest

Artisan crea un nuovo file in app/Http/Requests/ContattiRequest.php e ci inserisce del codice per facilitarti le cose.
Compila i metodi che trovi all'interno:

public function authorize()
{
	return true;
}

public function rules()
{
    return [
    	'nome'      => 'required|alpha|min:2',
    	'cognome'   => 'required|alpha|min:2',
    	'email'     => ‘required|email'
	];
}

Puoi aggiungere anche il metodo per i messaggi di errore:

public function messages()
{
	return [
		'required'	=>  'Il campo :attribute è necessario',
		'alpha'		=>	'Il :attribute dev'essere composto da sole lettere',
		'min'		=>	'Il :attribute dev'essere composto da minimo :min caratteri',
		'email'		=>	'L\'email deve avere il formato nome@fominio.tld'
	];
}

Gli array con le regole e i messaggi ci sono anche qui, solo che sono inseriti nei metodi rules() e messages().

Il metodo authorize, che di default ritorna false, si preoccupa di bloccare o consentire l'applicazione delle regole a seconda che la condizione inserita sia vera o falsa.
Faccio un esempio: diciamo che il form può essere validato solo se l'utente è loggato, oppure se ha un determinato ruolo. Dentro il metodo authorize() puoi valutare questa condizione.
Nel caso non passi l'autorizzazione, viene lanciata un'eccezione UnauthorizedException.

Se i dati da validare sono, come nel nostro caso, in un form accessibile da chiunque, puoi impostare il booleano a true.

Il refactoring di invioDati()

Nella request personalizzata, hai fatto tutto il necessario.
Questa Request agisce come la validazione con reindirizzamento automatico vista all'inizio di questo post, perciò quello che ti rimane da fare è di iniettare la nuova dipendenza: invece della classe Request, dobbiamo mettere ContattiRequest:

public function inviaDati(ContattiRequest $request)
{
	// codice per il caso della validazione superata 
}

Tutto qua, che tu ci creda o no: all'invio del form i dati vengono intercettati dalla classe ContattiRequest che gli applica le regole di validazione: se le passa, il codice viene eseguito, altrimenti torna indietro con errori e input.

I vantaggi della Form Request Validation

Se ci pensi, la soluzione della classe personalizzata che estende la classe Request facilita il riutilizzo del codice e la sua manutenzione. Puoi creare una CustomRequest da usare in diversi punti della tua applicazione, semplicemente iniettandola come dipendenza nel metodo in cui effettuare la validazione.
Oltre al vantaggio dell'automatismo del redirect, che ti consente di scrivere poco codice per avere la gestione di passes() e fails().
Infine, pensa all'eventualità, tutt'altro che remota, di dover rimettere mano alle regole di validazione per toglierne o aggiungerne qualcuna in un successivo momento: le trovi tutte nella cartella app/Http/Requests/.

Conclusioni

Come hai visto, Laravel fornisce davvero molti strumenti per implementare la validazione.
Puoi realizzarla come preferisci, tenendo presente che ci sono strategie più scalabili di altre.
Come in tutta la stesura del codice, sta a te scegliere quella più opportuna per quello che devi realizzare.


Blog tags


Cerca un post


Ultimi tweet


pubblicato il {{ tweet.created_at | formattaData }}