Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Laravel e la validazione dei dati

Impariamo a gestire la validazione dei dati e i messaggi si errore tramite il framework PHP Laravel, anche creando regole di validazione personalizzate.
Impariamo a gestire la validazione dei dati e i messaggi si errore tramite il framework PHP Laravel, anche creando regole di validazione personalizzate.
Link copiato negli appunti

Validazione e controller

Il pattern MVC di Laravel prevede che la validazione dei dati deve essere eseguita all'interno dei controller in quanto componenti dedicati all'integrazione Web dell'applicazione. Per questo scopo, il framework, fornisce un trait, ValidatesRequest, che implementa un metodo, validate, che appunto facilita la validazione di request HTTP.

Il metodo accetta la richiesta HTTP corrente e una serie di regole, in automatico si occupa di rispondere all'utente con una notifica di errore in caso di dati non conformi. All'interno della nostra applicazione demo abbiamo già utilizzato questa modalità di validazione all'interno dei nostri controller. Riporto un esempio per comodità preso dall'AuthorController:

public function store(Request $request) {
    $this->validate($request, [
        'firstname' => 'required|min:3|max:40',
        'lastname' => 'required|min:3|max:40'
    ]);
    [....]
}

In questo caso le regole sono semplici: firstname e lastname sono campi obbligatori di lunghezza compresa tra 3 e 40 caratteri. L'oggetto $request invece viene reso disponibile da Laravel stesso, tramite dependency injection, grazie alla definizione del tipo dell'oggetto nella firma del metodo.

La definizione delle regole però non è l'unica attività da svolgere; è necessario anche notificare all'utente gli errori che il sistema ha identificato. In caso di errori il framework redirige l'utente sulla pagina precedente (nella quale solitamente è presente un form) creando una variabile flash contenente gli errori. Le variabili flash sono speciali variabili che vengono salvate nella sessione HTTP ma che hanno durata limitata ad una solo richiesta e vengono utilizzate esclusivamente per un passaggio di dati tra due pagine.

Per questo motivo, all'interno della nostra view, sarà disponibile una variabile di nome $errors che sarà un'istanza di Illuminate\Support\MessageBag. Ecco come vengono mostrati gli errori di uno specifico campo all'interno di author/form.blade.php:

<div class="form-group {{ $errors->has('firstname') ? 'has-error' : '' }}">
    {!! Form::label('firstname', 'Firstname') !!}
    {!! Form::text('firstname', null, ['class' => 'form-control']) !!}
    @foreach($errors->get('firstname') as $error)
        <span class="help-block">{{ $error }}</span>
    @endforeach
</div>

Altre modalità di validazione

La modalità implementata in Biblios è la più semplice e quella offerta di default da Laravel. Nel caso ci fosse bisogno di un maggior controllo sul flusso di approvazione dei dati è comunque possibile configurare la validazione ad un livello più basso.

La prima modalità è quella di creare manualmente il validatore senza utilizzare il trait ValidatesRequest. In questo modo le righe da scriver sono di più ma è possibile personalizzare il comportamento nel caso di errori:

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'firstname' => 'required|min:3|max:40',
        'lastname' => 'required|min:3|max:40'
    ]);
    if ($validator->fails()) {
        return redirect('author/form')
                    ->withErrors($validator)
                    ->withInput();
    }
    [....]
}

Tale modalità, che permette una maggiore riusabilità del codice, prevede la creazione di un oggetto Request personalizzato. Laravel infatti permette di iniettare all'interno dei metodi dei controller non solo oggetti standard ma anche personalizzati. E' infatti possibile definire tipologie di richieste custom, con delle proprie caratteristiche e riutilizzarle anche in controller differenti.

Eventuali oggetti Request vengono salvati all'interno della cartella app/Http/Request ed è presente un comando per la creazione automatica di questi file:

php artisan make:request

Le request create in questo modo presentano alcuni metodi già definiti ma senza comportamento specifico. Il metodo da implementare è rules che deve restituire l'elenco delle regole attive per la richiesta. Una volta definite sarà possibile utilizzare l'oggetto sfruttando la dependency injection nei controller. La validazione scatterà a priori e il codice del controller verrà eseguito solamente se la validazione ha dato esito positivo.

Messaggi di errore

I messaggi mostrati sono etichette di testo localizzate gestite dal motore di localizzazione di Laravel. In automatico Laravel utilizza i messaggi contenuti nel file resources/lang/validation.php me è possibile personalizzarli tramite due approcci:

  1. modificando i file contenenti le risorse per creare messaggi comuni a tutta l'applicazione;
  2. passando un nuovo oggetto al metodo statico Validator::make per creare messaggi dedicati alla singola istanza del validatore.

Dato che Laravel presenta solamente messaggi tradotti in inglese, può essere comodo aggiungere tra le dipendenze questo progetto che presenta messaggi di validazione già localizzati in 52 diversi idiomi.

Regole di validazione standard e custom

Laravel presenta un set abbastanza ricco di regole out-of-the-box, è però possibile implementare logiche e regole personalizzate di validazione all'interno del metodo boot di un service provider in modo che il framework le carichi all'avvio.

Un'eventuale regola (canDrive) che controlla che l'età sia maggiore del minimo legale per avere la patente potrebbe essere:

[...]
public function boot()
{
    Validator::extend('canDrive', function($attribute, $value, $parameters, $validator) {
        return $value >= 18;
    });
}
[...]

Per utilizzala si dovrà richiamarla come se fosse una normale regola Laravel.

Ti consigliamo anche