Come programmare con Yii2 Validazioni

Cosa starai creando

Se stai chiedendo, "che cos'è Yii?" guarda il mio tutorial precedente: Introduzione al framework Yii, che rivede i vantaggi di Yii e include una panoramica delle novità in Yii 2.0, rilasciata nell'ottobre 2014.

In questa serie di programmazione con Yii2, guido i lettori all'uso del nuovo Yii2 Framework per PHP. In questo tutorial, ti presenterò i validatori di Yii2. I validatori semplificano il codice necessario per convalidare l'input, ovvero verificare la conformità o la non conformità dell'input dei dati, in genere dagli utenti tramite moduli Web.

Per questi esempi, continueremo a sfruttare la base di codice dell'applicazione Hello che abbiamo utilizzato nelle esercitazioni precedenti. Usa i link GitHub in questa pagina per ottenere il codice.

Solo un promemoria, parteciperò alle discussioni dei commenti qui sotto. Sono particolarmente interessato se hai idee aggiuntive o vuoi suggerire argomenti per futuri tutorial. Puoi anche raggiungermi @reifman su Twitter. 

Cos'è un validatore?

Se sei uno sviluppatore web, probabilmente sai che l'input dell'utente non può essere considerato attendibile. Ad esempio, gli utenti possono utilizzare le tecniche di iniezione SQL per provare a eseguire query che modificano o rivelano password. Qualcuno una volta ha sfruttato l'iniezione SQL contro la mia installazione PHPList open source ed è riuscito a scoprire una delle mie password (PHPList le ha archiviate in testo normale). Più comunemente, vuoi solo assicurarti che i dati forniti dagli utenti siano conformi ai tipi, ai moduli e agli intervalli della tua applicazione.

Costruire validatori in PHP a mano richiede tempo. Il framework Yii offre un sacco di funzionalità di validazione di base, quindi non è necessario crearle da zero. Ma se hai bisogno di alcune estensioni personalizzate, anche questo è semplice.

Le convalide sono un altro motivo per cui penso che abbia sempre senso creare applicazioni su un framework web come Yii piuttosto che vaniglia PHP.

Nei precedenti episodi, abbiamo anche parlato molto del generatore di codice di Yii, Gii. Uno dei vantaggi di Gii è che scriverà le regole di convalida appropriate per i propri modelli in base alle definizioni del tipo SQL nello schema. Questo è un grande risparmio di tempo.

Quali validazioni supporta Yii?

Ecco una lista dei validatori Yii integrati e collegamenti alla documentazione:

  • BooleanValidator. Assicura che un valore sia vero o falso.
  • CaptchaValidator. Convalida un campo di verifica del modulo CAPTCHA.
  • CompareValidator. Confronta due valori dalla forma o una costante, ad es. x deve essere inferiore a 99.
  • DateValidator. Assicura valore è una data.
  • DefaultValueValidator. Non è un vero validatore. Imposta i valori predefiniti per i campi vuoti.
  • NumberValidator. Assicura che un valore sia numerico, ad es. intero o float.
  • EmailValidator. Assicura che un valore sia un indirizzo email valido.
  • ExistValidator. Assicura che un valore esista in un'altra tabella.
  • FileValidator. Garantisce l'esistenza di un file caricato.
  • FilterValidator. Non è un vero validatore. Esegue una trasformazione sul valore fornito.
  • ImageValidator. Convalida le proprietà dell'immagine e dell'immagine.
  • RangeValidator. Assicura che un valore sia all'interno di un elenco di valori.
  • RegularExpressionValidator. Esegue la convalida rispetto a una condizione definita da un'espressione regolare.
  • RequiredValidator. Assicura che sia presente un valore.
  • SafeValidator. Non è un vero validatore. Consente l'assegnazione massiccia di un modulo Web pubblicato per includere un attributo. per esempio. $ model-> attributes = $ _POST ['Comment'];
  • StringValidator. Assicura il valore è una stringa.
  • UniqueValidator. Assicura che il valore sia univoco all'interno di una tabella, come ad esempio un indirizzo email.
  • UrlValidator. Assicura il valore in formato URL, ad es. http://yourdomain.com

Come funziona la validazione di Yii

Ecco come Yii descrive il flusso di convalida. In genere, è possibile utilizzare lo scenario predefinito e non è necessario crearne di propri. Generalmente dovrai fare affidamento su Gii per generare regole o scrivere le tue.

Quando il convalidare() viene chiamato il metodo, viene eseguita la seguente procedura per eseguire la convalida:

  1. Determinare quali attributi devono essere convalidati ottenendo l'elenco degli attributi da yii \ base \ Model :: scenari () utilizzando lo scenario corrente. Questi attributi sono chiamati attributi attivi.
  2. Determinare quali regole di convalida devono essere utilizzate recuperando l'elenco delle regole da yii \ base \ Model :: rules () utilizzando lo scenario corrente. Queste regole sono chiamate regole attive
  3. Utilizzare ciascuna regola attiva per convalidare ciascun attributo attivo associato alla regola. Le regole di convalida vengono valutate nell'ordine in cui sono elencate.

In base alle precedenti fasi di convalida, un attributo verrà convalidato se e solo se si tratta di un attributo attivo dichiarato in scenari () ed è associato a una o più regole attive dichiarate in regole().

Esempio di regole di convalida del modello

Ecco come può apparire una serie di regole di convalida del modello. Li ho presi dal modello Place Planner dell'applicazione Meeting Planner:

 public function rules () return [[['name', 'slug'], 'required'], [['place_type', 'status', 'created_by', 'created_at', 'updated_at'], 'intero' ], [['nome', 'google_place_id', 'slug', 'sito web', 'full_address', 'vicinanze'], 'stringa', 'max' => 255], [['sito web'], 'url '], [[' slug '],' unique '], [[' searchbox '],' unique ',' targetAttribute '=>' google_place_id '], [[' name ',' full_address '],' unique ' , 'targetAttribute' => ['name', 'full_address']],]; 

Man mano che implementiamo i nostri esempi di convalida più avanti, imparerai cosa rappresentano ognuna delle definizioni sopra.

Esempio di visualizzazione degli errori

Esistono un paio di modi per accedere agli errori restituiti dalla convalida. 

Ecco un esempio di come ottenere la matrice di errori nel controller:

$ model = new \ app \ models \ ContactForm; // popola gli attributi del modello con input utente $ model-> attributes = \ Yii :: $ app-> request-> post ('ContactForm'); if ($ model-> validate ()) // tutti gli input sono validi else // validation failed: $ errors è un array contenente messaggi di errore $ errors = $ model-> errors; 

Ed ecco un esempio di sfruttamento della funzione errorSummary di Yii all'interno di ActiveForms:

errorSummary ($ modello); ?>

Ecco come appare:

Convalida avanzata

Negli episodi successivi, fornirò anche esempi di utilizzo di funzioni di convalida avanzate:

  • Definire scenari per applicare selettivamente regole per determinate situazioni
  • Definizione dei messaggi di errore personalizzati
  • Eventi di convalida per sovrascrivere la convalida o eseguire funzionalità specifiche prima e / o dopo la convalida
  • Convalida condizionale per eseguire una regola di convalida solo se un evento specifico è vero
  • Convalida Ad Hoc per utilizzare le regole di convalida indipendentemente dall'invio del modulo
  • Validatori personalizzati per creare convalide essenziali oltre a quelle offerte da Yii
  • Convalida lato client per utilizzare la convalida JavaScript ActiveForm integrata di Yii senza richiedere un aggiornamento della pagina
  • Convalida AJAX per l'implementazione delle convalide AJAX lato server per estendere le funzionalità di convalida della pagina JavaScript di Yii sul lato client

Per ora, iniziamo a esaminare esempi dei vari tipi di validatori incorporati.

Validatori di campo di base

Diamo un'occhiata ad alcuni dei validatori di campo di base che sono utili per l'implementazione della forma quotidiana.

Preparazione di un modello mediante Migrazioni e Gii

Come abbiamo fatto nei primi episodi di questa serie, creerò una migrazione:

./ yii migrate / create create_sample_table

Creerò un modello di esempio per creare esempi di schemi e convalide utilizzando Gii. Ecco il codice di migrazione:

db-> driverName === 'mysql') $ tableOptions = 'SET CARATTERE utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('% sample', ['id' => Schema :: TYPE_PK, 'thought' => Schema :: TYPE_STRING. 'NOT NULL DEFAULT ""', 'goodness' => Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'rank' => Schema :: TYPE_INTEGER. 'NOT NULL', 'censorship' => Schema :: TYPE_STRING. 'NOT NULL', 'happened' => Schema :: TYPE_DATE. 'NOT NULL',], $ tableOptions);  public function down () $ this-> dropTable ('% sample'); 

Quindi, eseguiremo la migrazione:

./ yii migrate / up Yii Migration Tool (basato su Yii v2.0.2) Totale 1 nuova migrazione da applicare: m150219_235923_create_sample_table Applicare la migrazione sopra descritta? (sì | no) [no]: sì *** applicando m150219_235923_create_sample_table> crea tabella % sample ... done (time: 0.009s) *** applicato m150219_235923_create_sample_table (time: 0.015s) Migrato con successo. 

Quindi, utilizzeremo il generatore di codice di Yii per creare un modello:

E poi i file CRUD:

Gii genera queste regole di convalida di esempio:

class Sample extends \ yii \ db \ ActiveRecord public function rules () return [['goodness', 'rank'], 'intero'], [['rank', 'censura', 'verificato'], ' richiesto '], [[' happened '],' safe '], [[' thought ',' censorship '],' string ',' max '=> 255]]; 

Ora, usiamoli per lavorare e analizzare alcuni dei validatori di base.

Validatore richiesto

RequiredValidator garantisce che sia presente un valore. Puoi vederlo in posizione sopra per la classifica, la censura e si è verificato.

Visita il modulo di esempio di creazione generato da Gii, ad es. http: // localhost: 8888 / ciao / campione / creare. La convalida del client JavaScript ActiveForm di Yii presenterà un messaggio di errore anche quando si fa clic su uno di questi campi.

Safe Validator

SafeValidator non è un vero validatore. Permette l'assegnazione massiccia di un modulo web pubblicato per includere un attributo. per esempio. $ model-> attributes = $ _POST ['Comment']. Oppure, in Gii creato SampleController, puoi vedere questo codice:

funzione pubblica actionCreate () $ model = new Sample (); if ($ model-> load (Yii :: $ app-> request-> post ()) && $ model-> save ()) return $ this-> redirect (['view', 'id' => $ modello-> id]);  else return $ this-> render ('create', ['model' => $ model,]); 

Senza la regola di sicurezza nel modello di esempio (o un'altra regola), il valore verificato non verrebbe assegnato agli attributi del modello. Ciò riduce la probabilità di un vettore di attacco aggiuntivo senza codice deliberato.

regole di funzione pubblica () return [[['happened'], 'safe'],

Validatore valore predefinito

DefaultValueValidator non è un vero validatore. Imposta i valori predefiniti per i campi vuoti.

Cambiamo la regola per si è verificato per impostare un valore di data predefinito utilizzando la data corrente. Rimuoveremo anche il validatore richiesto per consentire al validatore predefinito di riempire il valore.

public function rules () return [[['bontà', 'rango'], 'numero intero'], [['rango', 'censura'], 'richiesto'], // Gii ha creato questo // [[' occorso '],' sicuro '], [' verificato ',' default ',' valore '=> data ("Ymd")],

Quando creiamo un nuovo campione e lasciamo il si è verificato campo vuoto, è possibile vedere la vista risultante include la data corrente compilata dal validatore del valore predefinito.

filtri

Il FilterValidator non è un vero validatore. Esegue una trasformazione su un valore fornito. Più comunemente, puoi usare questo per tagliare gli spazi bianchi dalle estremità di una stringa. 

FilterValidators sono definiti con callback di funzioni inline come questa funzione di convalida personalizzata:

// un validatore inline definito come funzione anonima ['token', funzione ($ attribute, $ params) if (! ctype_alnum ($ this -> $ attribute)) $ this-> addError ($ attribute, 'The token deve contenere lettere o cifre. '); ],

Poiché trim è una funzione nativa di PHP, possiamo semplicemente dichiarare la nostra regola di validazione in linea:

 [['pensato'], 'assetto'], 

Se si inoltra un modulo con spazi in attesa o in coda nel campo pensiero, FilterValidator li rimuoverà.

Ora, diamo un'occhiata ad alcuni dei validatori di tipo built-in.

Il tipo Validators

I validatori di tipo assicurano che i dati dell'utente siano conformi a tipi specifici, spesso quelli specificati nello schema del database. Gii genererà questi automaticamente.

String e Number Validator

StringValidator garantisce che un valore sia una stringa. NumberValidator garantisce che un valore sia numerico, ad es. intero o float. 

Ecco le definizioni delle regole di esempio:

 public function rules () return [[['bontà', 'rango'], 'intero'], [['pensiero', 'censura'], 'stringa', 'max' => 255] // [[ 'rank', 'censorship'], 'required'], 

Sto anche temporaneamente rimuovendo la convalida richiesta per vedere come le validazioni di stringhe e numeri funzionano in modo indipendente.

Ecco come appariranno i messaggi di errore di convalida:

Il bene così alto fallisce perché non è un numero, mentre il grado 27 passa. La censura è vuota (NULL) e fallisce la convalida della stringa.

booleano Validator

Il valore BooleanValidator garantisce che un valore sia vero o falso. È possibile definire i valori per true e false. I valori di default sono interi 0 o 1. Questo validatore può essere più utile quando il campo viene utilizzato con un selettore a discesa, ad es. Si No.

Ecco come ho definito la mia regola per Boolean:

 public function rules () return [[['bontà'], 'booleano'], [['rango'], 'intero'], 

Ecco il messaggio di errore del validatore booleano:

data Validator

DateValidator garantisce che il valore sia una data formattata correttamente che può essere personalizzata con un attributo di formato. Con Yii ActiveForm, questa è attualmente una convalida lato server. Pertanto, ho anche aggiunto una regola richiesta per il campo Occurred.

Ecco le mie definizioni di regole con il validatore di date per il campo Occurred:

public function rules () return [[['bontà'], 'booleano'], [['rank'], 'intero'], [['pensiero', 'censura'], 'stringa', 'max' => 255], [['rank', 'censura', 'verificato'], 'richiesto'], ['verificato', 'data', 'formato' => 'yyyy-M-d'], // ['occurred', 'default', 'value' => date ("Ymd")], [['thought'], 'trim'],]; 

Ecco come appare quando inviamo il modulo:

Qual'è il prossimo?

Guarda le prossime esercitazioni nella mia serie Programming with Yii2 mentre continuo a immergermi nei diversi aspetti del framework. Nei prossimi due episodi, ti guiderò attraverso i restanti validatori e ti mostrerò come creare estensioni avanzate per il framework di convalida di Yii.

Potresti anche voler controllare la mia creazione della tua startup con la serie PHP, che usa il template avanzato di Yii2 mentre costruisco un'applicazione del mondo reale.

Accolgo richieste di argomenti e argomenti. Puoi postarli nei commenti qui sotto, inviarmi ping su @reifman su Twitter, o mandarmi una e-mail sul mio sito web di Lookahead Consulting.

Se vuoi sapere quando arriverà il prossimo tutorial di Yii2, controlla la mia pagina di Tuts + istruttore. Include sempre tutti i miei articoli immediatamente dopo la loro pubblicazione. 

Link correlati

  • Yii2 Guida alla convalida dell'input dell'utente
  • Validatori Yii2 (documentazione)
  • Yii2 Developer Exchange, il mio sito di risorse Yii2