Cum să programați cu Yii2 Validări specializate

Ce veți crea

Dacă vă întrebați: "Ce este Yii?" verificați tutorialul meu anterior: Introducere în Cadrul Yii, care analizează beneficiile Yii și include o prezentare generală a ceea ce este nou în Yii 2.0, lansat în octombrie 2014.

În această serie de programare cu seria Yii2, îndrumăm cititorii în folosirea noii tehnologii Yii2 Framework for PHP. Acest tutorial este a doua noastră parte, privind validatorii Yii2. Validatorii simplifică codul necesar pentru a valida intrarea, adică verifică conformitatea sau neconformitatea datelor introduse, de obicei de la utilizatori prin intermediul formularelor web. Mai precis, vom explora unele dintre validările de specialitate încorporate care sunt comune dezvoltării web.

Iată o listă a validatorilor Yii încorporați și linkurile către documentația pe care o vom explora:

  • CaptchaValidator: Validă un câmp de verificare a formularului CAPTCHA.
  • CompareValidator: Compară două valori din formular sau o constantă, de ex. x trebuie să fie mai mică de 99.
  • EmailValidator: Asigură o valoare este o adresă de e-mail validă.
  • ExistValidator: Asigură existența unei valori într-un alt tabel.
  • FileValidator: Asigură existența unui fișier încărcat.
  • ImageValidator: Validează proprietățile imaginii și imaginii.
  • RangeValidator: Asigură o valoare se află într-o listă de valori.
  • RegularExpressionValidator: Efectuează validarea în funcție de o condiție definită de o expresie regulată.
  • UniqueValidator: Asigură valoarea este unică într-un tabel, cum ar fi o adresă de e-mail.
  • UrlValidator: Asigură valoarea este în format URL, de ex. http://yourdomain.com.

Vă voi îndruma prin exemple ale fiecăreia dintre aceste validări folosind codul de aplicație Hello din tutorialele anterioare și un cuplu din seria Building your Startup Series, care utilizează de asemenea Yii2. Utilizați legăturile GitHub din această pagină pentru a obține codul.

Doar un memento, eu particip la comentariile de mai jos. Sunt interesat în mod special dacă aveți idei suplimentare sau doriți să sugerați subiecte pentru tutoriale viitoare. Puteți să mă contactați și pe @reifman pe Twitter sau să mă trimiteți prin e-mail la Lookahead Consulting.

Ce este un validator?

Dacă sunteți un dezvoltator de web, știți că intrările utilizatorilor nu pot fi de încredere. De exemplu, utilizatorii pot folosi tehnici de injectare SQL pentru a încerca să ruleze interogări care modifică sau expun parolele. Cineva a profitat din când în când de o injecție SQL împotriva instalării open source PHPList și a reușit să descopere una dintre parolele mele (PHPList stocată în text simplu). Mai frecvent, doriți doar să vă asigurați că utilizatorii de date oferă informații conforme cu tipurile, formularele și intervalele aplicației dvs..

Validarea clădirilor în PHP cu mâna necesită timp. Cadrul Yii oferă o tonă de caracteristici de validare de bază, astfel încât nu este nevoie să le construiți de la zero. Dar, dacă aveți nevoie de unele extensii personalizate, este chiar simplu.

Validările sunt încă un alt motiv pentru care cred că este întotdeauna logic să construiți aplicații pe un cadru web, cum ar fi Yii, mai degrabă decât vanilie PHP.

În episoadele anterioare, am vorbit și despre generatorul de cod Yii, Gii. Unul dintre avantajele Gii este că va scrie regulile de validare corespunzătoare pentru modelele dvs. bazate pe definițiile de tip SQL din schemă. Acesta este un economizor de timp mare.

Poate doriți să vă întoarceți la ultimul episod pentru a citi mai multe despre validările de bază ale modelului Yii2.

Acum, să începem să ne uităm la următorul set de validatori Yii2 încorporați.

Setul următor de validatori

Validatorul Captcha

Să începem cu CaptchaValidator care verifică dacă există un răspuns adecvat la un câmp de verificare CAPTCHA. CAPTCHA-urile vă ajută să vă asigurați că un om completează formularul, sperând să păstrați scripturile automate de la acesta.

Iată un exemplu de Captcha Yii în acțiune:

În baza de date Hello, am simplificat formularul nostru de probă pentru a include doar câmpurile Gândire și Captură pentru moment. Iată o privire la definițiile de reguli ale modelului de model:

Exemplu de clasă se extinde \ yii \ db \ ActiveRecord public $ captcha; / ** * @inheritdoc * / reguli de funcționare publică () return [['thought'], string ',' max '=> 255] ]], [['captcha'], 'captcha'],]; 

Captcha nu face parte din schema bazei noastre de date - este utilizată doar pentru a verifica formularul. Prin urmare, am adăugat un atribut modelului pentru acesta, de ex. public $ captcha;.

Iată codul de vizualizare pentru formular. Trebuie să includem biblioteca Captcha în partea de sus.

 
errorSummary ($ model); ?> câmp ($ model, 'gândit') -> textInput (['maxlength' => 255])?> câmp ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: classname (), [// configurați mai multe proprietăți widget aici]
esteNewRecord? 'Creare': 'Actualizare', ['class' => $ model-> isNewRecord? 'btn btn-succes': 'btn btn-primary'])?>

Iată ce arată validarea Captcha în acțiune:

Dacă faceți clic pe Captcha, Yii va genera o nouă imagine.

Validatorul comparativ

Acum, hai să mergem la CompareValidator. Acest validator compară două valori de la formular sau o singură valoare de formă la o constantă, cum ar fi x trebuie să fie mai mică de 99.

Pentru acest exemplu, vreau să vă asigur că intrarea utilizatorilor pentru rang este mai mare decât zero, dar mai mică sau egală cu 100.

Mai întâi, adaug câmpul de intrare în formularul nostru pentru atributul rank:

 errorSummary ($ model); ?> câmp ($ model, 'gândit') -> textInput (['maxlength' => 255])?> câmp ($ model, 'rang') -> textInput ()?> câmp ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: classname (), [// configurați mai multe proprietăți widget aici] 

Apoi voi adăuga două reguli de validare comparați la modelul nostru:

 reguli de funcționare publică () return [['thought'], 'string', 'max' => 255], [['thought'], 'trim'], [[thought '], required) , [['captcha', 'captcha'], ['rank', 'integer'], 'rank', 'compare', 'compareValue' => 0, 'operator' => ' , ['rank', 'compare', 'compareValue' => 100, 'operator' =><='], ];  

Puteți vedea aici o listă completă de operatori de comparație disponibili.

Iată cum arată forma noastră atunci când utilizatorul trimite un atribut nevalid:

Dacă vrem să furnizăm regulile specifice de constrângere într-un singur mesaj de eroare, Yii Validatorii vă permit să personalizați eroarea afișată utilizatorului, cum ar fi:

Implementarea acestui lucru este destul de simplă cu adăugarea atributului mesaj:

reguli de funcționare publică () return [['thought'], 'string', 'max' => 255], [['thought'], 'trim'], [[thought '], required) , [['captcha', 'captcha'], [['rank'], 'integer'], 'rank', 'compare', 'compareValue' 'mesaj' => Yii :: t ('app', 'Rank trebuie să fie cuprinsă între 0 și 100 inclusiv')], 'rank', 'compare', 'compareValue' =><=','message'=>Yii :: t ('app', 'Clasarea trebuie să fie cuprinsă între 0 și 100 inclusive')],]; 

Actualizând schema noastră pentru a testa mai multe validări

Pentru unele dintre aceste teste de validare următoare, vă voi cere să adăugați câmpuri în baza de date.

În \ migrări \ m150219_235923_create_sample_table.php, vom adăuga câteva câmpuri noi pentru a testa următorul set de validatori: e-mail, URL, nume de fișier etc..

$ this-> createTable ('% sample', ['id' => Schema :: TYPE_PK, 'thought' => Schema :: TYPE_STRING. :: NOTĂ NULL ',' rank '=> Schema :: TYPE_INTEGER.' NOT NULL ',' censorship '=> Schema :: TYPE_STRING. 'NOT NULL', 'email' => Schema :: TYPE_STRING. 'NOT NULL DEFAULT' ',' url '=> Schema :: TYPE_STRING. TYPE_STRING. 'NOT NULL', 'avatar' => Schema :: TYPE_STRING. 'NOT NULL',], $ tableOptions); 

Apoi rulați migrarea în jos pentru a lăsa masa și apoi sus:

Administratori-MBP: salut Jeff $ ./yii migrați / dezinstalați 1 Instrument de migrare Yii (bazat pe Yii v2.0.2) Migrarea totală 1 care urmează să fie returnată: m150219_235923_create_sample_table Reveniți migrarea de mai sus? (da | nu): nu *** reverting m150219_235923_create_sample_table> drop table % sample ... făcut (timpul: 0.002s) *** reluat m150219_235923_create_sample_table (time: 0.005s) Administratori-MBP: hello Jeff $ ./yii Migrați / up 1 Instrument de migrare Yii (bazat pe Yii v2.0.2) Se va aplica o nouă migrare totală: m150219_235923_create_sample_table Aplicați migrarea de mai sus? (da: nu): da *** aplicând m150219_235923_create_sample_table> crează tabel % sample ... făcut (timpul: 0.007s) *** aplicat m150219_235923_create_sample_table (time: 0.010s).

Suntem gata să testați validatorii de e-mail și de adrese URL.

E-mail și Validatorii URL

EmailValidator asigură o valoare este o adresă de e-mail validă și UrlValidator asigură că o valoare este în format URL, de ex. http://yourdomain.com. 

Este foarte simplu să creați reguli pentru noile câmpuri de e-mail și adrese URL:

 reguli de funcționare publică () return [['thought'], 'string', 'max' => 255], [['email'], 'email'], [[url '],' url '), 

Iată codul de vizualizare pentru formular. Rețineți modul în care folosesc etichete personalizate pentru a îmbunătăți gradul de utilizare a formularului:

errorSummary ($ model); ?> câmp ($ model, 'gândit') -> textInput (['maxlength' => 255])?> câmp ($ model, 'email') -> textInput () -> etichetă (Yii :: t ('app' câmp ($ model, 'url') -> textInput () -> etichetă (Yii :: t ('app'

Iată validatorii în acțiune:

Acestea sunt în mod evident extrem de utile pentru aplicațiile web.

Validatorul Exist

Sistemul ExistValidator este foarte util în anumite scenarii. Se poate asigura că există o valoare într-un alt tabel. Și poate fi folosit într-o varietate de moduri - iată câteva exemple prezentate în documentație:

// a1 trebuie să existe [a1 ',' exist '] // // a1 trebuie să existe, dar valoarea lui va folosi a2 pentru a verifica existența [' a1 ',' exist ',' targetAttribute '=> ] // a1 și a2 trebuie să existe împreună și ambii vor primi mesajul de eroare [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1', 'a2']] a1 și a2 trebuie să existe împreună, numai a1 va primi mesajul de eroare ['a1', 'exist', 'targetAttribute' => ['a1', 'a2']] // a1 trebuie să existe verificând existența ambelor a2 și a3 (folosind valoarea a1) ['a1', 'exist', 'targetAttribute' => ['a2', 'a1' => 'a3']]

Documentația Yii evidențiază faptul că existența poate fi folosită pentru a "verifica dacă o cheie străină conține o valoare care poate fi găsită în tabelul străin".

Pentru exemplul nostru, voi crea o regulă care verifică faptul că adresa de e-mail din formular există deja în tabelul nostru utilizator înregistrat. Pentru a face acest lucru, vom folosi targetClass care îi spune lui Yii care clasă (sau tabelul modelului) să caute adresa de e-mail a utilizatorului în vederea validării. 

Iată definiția regulii - rețineți includerea modelului nostru de utilizator în partea de sus:

 255], [['email'], 'email'], ['email'], 'exist', 'targetClass' => 'app', 'Ne pare rău, această persoană nu sa înregistrat încă')], [['url'], 'url'),

Aceasta instruiește Yii să interogheze tabelul Utilizator pentru a se asigura că adresa de e-mail furnizată corespunde unui utilizator înregistrat anterior.

Iată cum arată în acțiune:

Puteți afla mai multe despre existența validării și a permutărilor sale aici.

Validatorii de fișiere și imagini

Apoi, vă voi arăta exemple de FileValidator, care asigură existența, tipul MIME și dimensiunea unui fișier încărcat și ImageValidator, care validează imaginea și proprietățile sale.

Pentru a explora validatorii de fișiere și imagini, hai să examinăm un exemplu din seria Building Your Startup With PHP: setările utilizatorului, imaginile de profil și detaliile de contact. În acest episod din modelul UserSettings, permitem utilizatorilor să încarce un fișier pentru imaginea lor de profil.

Atributul imagine acceptă fișierul încărcat:

 reguli de funcționare publică () return [['user_id',], 'obligatoriu'], [['user_id',], 'unic'], [[image '], '],' 'imagine', 'imagine', 'fișier', 'extensii' => 'jpg, gif, png' , 'extensii' => 'png, jpg, gif', 'minWidth' => 100, 'maxWidth' => 400, 'minHeight' => 100, 'maxHeight' => 400,], 

FileValidatorii asigură că imaginea se termină într-o extensie adecvată a imaginii și este mai mică de 100.000 de octeți. 

ImageValidator verifică, de asemenea, tipul de extensie, precum și lățimea și înălțimea imaginii.

Iată un exemplu de erori generate de încărcarea unei imagini a cărei dimensiuni sunt mai mari de 400 x 400 pixeli:

Acesta este asistentul meu de sus, care obișnuia să copieze tutorialele mele.

Intervalul în validator

Există și RangeValidator care asigură că o valoare se află într-o listă cu intrări admisibile. 

Pentru exemplul nostru, să adăugăm câmpul pentru cenzură înapoi în formular:

errorSummary ($ model); ?> câmp ($ model, 'gândit') -> textInput (['maxlength' => 255])?> câmp ($ model, 'email') -> textInput () -> etichetă (Yii :: t ('app' câmp ($ model, 'url') -> textInput () -> etichetă (Yii :: t ('app' câmp ($ model, "cenzură") -> textInput ()?> câmp ($ model, 'rang') -> textInput ()?> câmp ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: classname (), [// configurați mai multe proprietăți widget aici]

Apoi, vom adăuga un RangeValidator pentru a potrivi răspunsul cu un a da sau Nu şir:

 reguli de funcționare publică () return [[['thought'], 'string', 'max' => 255], [ ("App", "gândurile tale ar trebui să formeze o propoziție completă a caracterelor alfabetice"). ], '[' email '],' email ',' exist ',' targetClass '=> Aplicație "," Ne pare rău, acea persoană nu a fost înregistrată încă ")], [[url '],' url '], [' cenzură ',' nu "," mesaj "=> Yii :: t ('app', 'cenzorii cer un răspuns da sau nu')],

Iată un exemplu de RangeValidator în acțiune:

Validatorul de potrivire a expresiilor regulate

Apoi, să examinăm RegularExpressionValidator, care efectuează validarea în funcție de o condiție definită de o expresie regulată. 

În exemplul nostru, folosesc următorul regex pentru a potrivi propozițiile complete cu caractere alfabetice. Aceasta înseamnă că trebuie să se încheie fie cu (!,?, Sau.) Și să nu aibă caractere numerice.

 reguli de funcționare publică () return [[['thought'], 'string', 'max' => 255], [ ("App", "gândurile tale ar trebui să formeze o propoziție completă a caracterelor alfabetice"). ], 

Iată un exemplu de intrare a utilizatorului care nu reușește testul din cauza numărului și a lipsei unui semn de punctuație:

Iată o propoziție valabilă:

S-ar putea să fiți interesat de opt expresii regulate pe care trebuie să le cunoașteți (Tuts +) ca referință pentru modelele regex comune.

Validatorul unic

În cele din urmă, să examinăm sistemul UniqueValidator, care asigură faptul că o valoare este unică într-un tabel, cum ar fi o adresă de e-mail sau un slug.

Am revăzut SluggableBehavior mai devreme în această serie, care oferă propriul suport de unicitate încorporat. Cu toate acestea, să aruncăm o privire la câteva exemple din seria Building Your Startup With PHP. 

În baza de coduri pentru planificatorul de întâlniri (din cele mai recente episoade de tutorial) din modelul Place (\ \ modele de front-end \ Place.php), folosim validatorul unic în mai multe moduri:

regulile funcției publice () returnează [['nume', 'slug'], 'obligatoriu'], ['place_type', 'status', 'created_by', 'created_at' ], "['name', 'google_place_id', 'slug', 'website', 'full_address', 'proximity'], 'string', 'max' '', '[' ',' '', 'unic'], '[' , 'targetAttribute' => ['name', 'full_address']]]; 

Mai întâi, vom folosi regula unică cu slug pentru a mări comportamentul bătătos, care este redundant; dar puteți vedea formatul de validare.

În al doilea rând, verificăm că rezultatele căsuței de căutare Google Autocomplete rezultă în câmpul ascuns pentru google_place_id fiind unic prin faptul că încă nu există în tabela Places. În esență, prevenim duplicarea ID-urilor Google Place. 

Partea semnificativă a acestui lucru este că validatorul unic al lui Yii2 ne permite să impunem unicitatea pe câmpul vizibil (SearchBox) În timp ce îl validați pe coloana secundară returnată prin AJAX de la Google (google_place_id).

În al treilea rând, asigurăm asta Nume și adresa completa sunt unice împreună. Cu alte cuvinte, numele locurilor duplicate sunt în regulă. Poate exista un Starbucks bazilian. Cu toate acestea, nu vrem ca nimeni să intre în aceeași locație Starbucks de două ori.

Notă: Cafeaua Starbucks nu este un stimulent eficient pentru dezvoltatorii de software. Te încurajez să faci frecvente cafenele independente.

Iată un exemplu în acest sens:

Ce urmeaza?

Sper că sunteți de acord cu cât de simplu și util sunt validatorii Yii2 pentru dezvoltarea web. Pur si simplu nu imi pot imagina vreodata revenirea la dezvoltarea PHP vanilie fara ajutorul unui cadru.

Urmăriți tutorialele viitoare din programul meu de programare cu seria Yii2, deoarece continuam să scufundăm în diferite aspecte ale cadrului. În următorul episod, voi examina funcțiile avansate de validare ale lui Yii2, cum ar fi:

  • Condiționarea validării pentru a efectua o regulă de validare numai dacă un anumit eveniment este adevărat
  • Validatori personalizați pentru a crea validări esențiale dincolo de ceea ce oferă Yii din cutie
  • Validarea pe partea clientului pentru a face uz de validarea ActiveForm JavaScript a built-in-ului Yii, fără a necesita o reîmprospătare a paginii
  • Validarea AJAX pentru implementarea validărilor AJAX de pe partea serverului pentru a extinde capacitățile de validare a paginilor JavaScript de la clientul Yii.
  • Evenimentele de validare pentru a suprascrie validarea sau a efectua funcționalități specifice înainte și / sau după validare
  • Definirea scenariilor pentru aplicarea selectivă a regulilor pentru anumite situații
  • Validarea ad hoc pentru a utiliza reguli de validare independent de depunerea formularului

Salut cererile de teme și teme. Îi poți posta în comentariile de mai jos, conta la mine @reifman pe Twitter sau trimite-mi un e-mail la Lookahead Consulting.

Dacă doriți să știți când vine următorul tutorial Yii2, puteți verifica și pagina de instructor Tuts +. Întotdeauna includ link-uri către articolele mele imediat după publicare.

Link-uri conexe

  • Ghidul Yii2 pentru validarea intrărilor de utilizatori
  • Yii2 Ghid pentru Validatorii de bază
  • Validatorii Yii2 (Documentație)
  • Yii2 Developer Exchange, propriul site de resurse Yii2
Cod