Convalida dei dati in Laravel: comoda e potente
Pubblicato: 2023-05-03Ora più che mai, è fondamentale che i dati nelle tue applicazioni siano validi, accurati e soddisfino tutti i requisiti di sistema. Risponde alla necessità di mantenere la coerenza dei dati ed evitare vulnerabilità di sicurezza.
Laravel rende la convalida dei dati facile e intuitiva. Segue un'architettura Model View Controller (MVC) e richiede solo una conoscenza generale dei concetti di PHP e programmazione orientata agli oggetti (OOP). Inoltre, Laravel offre diversi metodi per convalidare i dati in arrivo.
Esplora alcuni di questi approcci e come applicare le regole di convalida al tuo set di dati.
Convalida dei dati semplificata in Laravel
Laravel fornisce diverse regole di convalida pronte all'uso per quando gli utenti dell'applicazione inviano dati tramite moduli. È possibile contrassegnare i campi di input come obbligatori, impostare una lunghezza minima o massima e richiedere voci univoche (non duplicate) e indirizzi e-mail validi. Il validatore Laravel verifica se l'input soddisfa queste regole o qualsiasi altra specificata.
Queste regole di convalida di Laravel includono:
-
required
— I dati del campo non devono essere nulli o vuoti. -
array
— I dati del campo devono essere un array PHP. -
bail
— La regola di convalida interrompe l'esecuzione dopo aver riscontrato il primo errore di convalida. -
email
— I dati del campo devono essere un indirizzo email valido. -
unique
— I dati del campo non devono avere duplicati nella tabella del database.
Tutti i metodi di convalida presentano vantaggi e svantaggi, ma la loro varietà consente di scegliere l'approccio migliore per le proprie esigenze. A seconda del metodo scelto, la convalida di Laravel può avvenire in diversi modi, con messaggi di errore manuali o automatici.
Il metodo più comune è code>validate, utilizzato per le richieste HTTP in entrata. Questo metodo è concatenato ai dati della richiesta, eseguendo le regole di convalida. Puoi separare le regole per ciascun campo con virgole, come mostrato nell'esempio seguente.
use Illuminate\Http\Request; public function store (Request $request){ $validated = $request->validate([ 'email' => ['required, unique:users, email, bail'], 'name' => ['required'], ]); }
Qui email
è un input obbligatorio, il che significa che non può essere nullo. Inoltre, deve essere univoco nella tabella del database users
, assicurando che lo stesso indirizzo email non venga registrato due volte. L'ultima regola impone che anche l'indirizzo e-mail sia valido. In caso contrario, il processo di convalida cessa. Il campo nome è obbligatorio ma non ha altre regole.
Se una regola di convalida di Laravel fallisce, viene generata automaticamente una risposta.
Nozioni di base sulla convalida
Per comprendere meglio i metodi di convalida, considera il seguente esempio. Definirai una route per l'endpoint e creerai un controller per convalidare ed elaborare i dati della richiesta.
Innanzitutto, crea un semplice endpoint che consenta agli utenti di archiviare le proprie e-mail e password.
Definisci il percorso
Le route di Laravel sono definite nel file route/web.php per un'applicazione Web o route/api.php per un'API. Per questo esempio, usa api.php :
use App\Http\Controllers\UserController; Route::post('/store', [UserController::class]);
Crea il controllore
Esegui questo comando Artisan per creare il controller:
php artisan make:controller UserController
Questo comando crea un file UserController.php nella directory app/Http/Controllers .
Ora, definisci un metodo store
per convalidare i dati che entrano nell'endpoint del negozio prima di archiviarli.
Questo esempio convaliderà i seguenti campi utilizzando queste regole:
- email — Deve essere univoco, un indirizzo email valido e deve essere obbligatorio
- password — Deve avere una lunghezza minima, confermare la password e deve essere obbligatoria
- età — Deve essere un numero e deve essere obbligatorio
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { /** * Store new user details. * */ public function store(Request $request){ $validated = $request->validate([ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]); // After user data is validated, logic to store the data } }
La regola confirmed
consente di richiedere un campo particolare due volte per verificare che i dati siano accurati, ad esempio gli utenti reinseriscono le proprie password durante la registrazione. Questa regola richiede un campo chiamato password_confirmation
, i cui dati devono corrispondere al campo password .
Visualizza messaggi di errore
Se i criteri di convalida vengono soddisfatti, il codice continuerà a funzionare normalmente. Se la convalida non riesce, viene generata un'eccezione IlluminateValidationValidationException
e viene restituita la risposta di errore appropriata.
L'esempio è basato su un'API, che restituisce una risposta HTTP 422 Unprocessable Entity
in formato JSON. Per le applicazioni Web, reindirizzava all'URL precedente per visualizzare il messaggio di errore e i dati della richiesta venivano visualizzati nella sessione.
Puoi utilizzare la variabile $errors
nelle tue visualizzazioni per visualizzare gli errori restituiti:
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
Puoi anche scegliere di visualizzare solo il primo errore o scorrere per visualizzarli tutti.
// Fetch all errors $errors->all() // Fetch only the first error $errors->first()
Ripopola moduli
Il ripopolamento dei moduli evita agli utenti di digitare nuovamente le informazioni in modo che possano concentrarsi sulla correzione dell'errore. Nell'esempio di un indirizzo e-mail non riuscito, puoi ripopolare il resto del modulo chiamando il vecchio valore per il campo name
.
$name = $request-> old('name') //Blade helper <input type="text" name="name" value="{{ old('name') }}">
Questa regola restituirebbe null
se non ci fosse alcun input precedente.
Convalida avanzata
Laravel fornisce un altro metodo per scrivere convalide chiamate richieste di moduli. Una richiesta di modulo è una classe di richiesta personalizzata che organizza le convalide e riordina il tuo controller.
Hanno la propria logica di convalida e autorizzazione adatta a grandi volumi di input e possono essere utilizzati per definire regole di convalida e personalizzare i messaggi di errore.
Per creare una richiesta di modulo, esegui questo comando Artisan:
php artisan make:request StoreUserRequest
Questo comando crea un file StoreUserRequest.php nella directory app/Http/Requests e contiene due metodi predefiniti:
-
rules
restituisce le regole di convalida per i dati della richiesta. -
authorize
restituisce un valore booleano per indicare se quell'utente dispone dell'autorizzazione per eseguire l'azione richiesta.
Converti l'esempio precedente per utilizzare una richiesta di modulo.
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreUserRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { // Add logic to check if the user is authorized to submit this data. return true; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]; } }
Per personalizzare i messaggi di errore di queste regole, puoi eseguire l'override del metodo messages nella classe FormRequest
.
/** * Get the error messages for the defined validation rules. * * @return array */ public function messages() { return [ 'email.required' => 'An email address is required', 'email.email' => 'The email address must be valid', 'password.confirmed'=>'Re-type your password as password_confirmation, passwords does not match' ]; }
Nota: il nome dei dati e la regola di convalida sono separati da un punto (.) prima dei dati del messaggio.
Convalida personalizzata
Per creare una convalida personalizzata, puoi utilizzare una facciata Validator
invece di validate
. L'istanza del validatore contiene due argomenti: i dati da convalidare e un array di regole di convalida. Questi due argomenti vengono passati al metodo ::make
sulla facciata del validatore, generando una nuova istanza del validatore.
use Illuminate\Http\Request; public function store (Request $request){ $validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]); if ($validator->fails()) { // Return errors or redirect back with errors return $validator->errors(); } // Retrieve the validated input... $validated = $validator->validated(); // Continue logic to store the data }
Se vuoi aggiungere un metodo diretto automatico, puoi eseguire il metodo validate
su un'istanza di validatore preesistente. Se la convalida non riesce, una richiesta XHR produce una risposta JSON con 422 Unprocessable Entity
come codice di stato oppure l'utente verrà reindirizzato immediatamente.
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'password' => 'required|min:7|confirmed' ])->validate();
Puoi anche personalizzare i tuoi messaggi di errore passando un terzo argomento chiamato messages
a Validate::make method
:
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ], $messages = [ 'required' => 'The :attribute field is required.', ]);
Nota: :attribute
viene sostituito con il nome del campo in fase di convalida.
Riepilogo
L'esecuzione della convalida dei dati è fondamentale per mantenere il set di dati pulito, corretto e completo. La convalida dei dati consente di eliminare gli errori nei dati che potrebbero potenzialmente danneggiare o influire in altro modo sul progetto. La convalida diventa sempre più importante quando si lavora su larga scala e con grandi quantità di dati.
Laravel consente numerosi approcci flessibili per garantire l'integrità e l'accuratezza dei dati che passano attraverso la tua applicazione. Puoi ottenere una logica di convalida complicata con metodi predefiniti e personalizzabili, rendendo la tua base di codice ben strutturata e più facilmente riutilizzabile.
Spedisci le tue app Laravel più velocemente con i servizi di hosting delle applicazioni di Kinsta.