Cum se programează cu Yii2 Validări

Ce veți crea

Dacă întrebiț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. În acest tutorial, vă prezint validatorii Yii2. Validatorii simplifică codul necesar pentru a valida intrarea, adică verifică conformitatea sau neconformitatea datelor introduse, de obicei de la utilizatori prin formulare web.

Pentru aceste exemple, vom continua să folosim codul aplicației Hello pe care l-am folosit în tutorialele anterioare. 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. 

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ă datele furnizate de utilizatori sunt 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.

Ce validări suportă Yii?

Iată o listă a validatorilor Yii construiți și legăturile către documentație:

  • BooleanValidator. Asigură o valoare este adevărată sau falsă.
  • CaptchaValidator. Validează un câmp de verificare a formularului CAPTCHA.
  • CompareValidator. Compară două valori din formă sau o constantă, de ex. x trebuie să fie mai mică de 99.
  • DateValidator. Asigură valoarea este o dată.
  • DefaultValueValidator. Nu este un adevărat validator. Setează valorile implicite pentru câmpurile goale.
  • NumberValidator. Asigură o valoare numerică, de ex. întreg sau float.
  • EmailValidator. Asigură o valoare este o adresă de e-mail validă.
  • ExistValidator. Asigură faptul că există o valoare într-un alt tabel.
  • FileValidator. Asigură existența unui fișier încărcat.
  • FilterValidator. Nu este un adevărat validator. Efectuează o transformare pe valoarea furnizată.
  • 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ă.
  • RequiredValidator. Asigură o valoare este prezentă.
  • SafeValidator. Nu este un adevărat validator. Permite alocarea masivă a unui formular web afișat pentru a include un atribut. de exemplu. $ model-> atributele = $ _POST ['Comment'];
  • StringValidator. Asigură valoarea este un șir.
  • UniqueValidator. Asigură valoarea este unică într-un tabel, cum ar fi o adresă de e-mail.
  • UrlValidator. Asigură valoarea este în formatul URL, de ex. http://yourdomain.com

Cum funcționează Validarea Yii

Iată cum Yii descrie fluxul de validare. De obicei, puteți utiliza scenariul implicit și nu aveți nevoie să construiți propriul scenariu. În general, trebuie să vă bazați pe Gii pentru a genera reguli sau a scrie propriile dvs..

Cand valida() metoda se numește, trece prin următorii pași pentru a efectua validarea:

  1. Determinați care atribute ar trebui validate prin obținerea listei de atribute din scenariile yii \ base \ Model :: scenariile () utilizând scenariul curent. Aceste atribute sunt numite atributele active.
  2. Determinați care reguli de validare ar trebui să fie utilizate prin obținerea listei de reguli de la yii \ base \ Model :: rules () folosind scenariul curent. Aceste reguli sunt numite regulile active
  3. Utilizați fiecare regulă activă pentru a valida fiecare atribut activ care este asociat cu regula. Regulile de validare sunt evaluate în ordinea în care sunt listate.

Conform pasilor de validare de mai sus, un atribut va fi validat dacă și numai dacă este un atribut activ declarat în scenarii () și este asociată cu una sau mai multe reguli active declarate în (norme).

Exemplu de reguli de validare a modelului

Iată ce ar putea să arate un set de reguli de validare a modelului. Le-am luat de la aplicația Planificator de Întâlniri Locul modelului:

 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']]]; 

Pe măsură ce implementăm propriile noastre exemple de validare mai jos, veți afla ce reprezintă fiecare dintre definițiile de mai sus.

Exemplu de afișare a erorilor

Există câteva modalități de a accesa erorile returnate prin validare. 

Iată un exemplu de obținere a unei serii de erori în controler:

$ model = new \ app \ models \ ContactForm; // atributele atributelor modelului cu intrările de utilizator $ model-> attributes = \ Yii :: $ app-> request-> post ('ContactForm'); dacă ($ model-> validate ()) // toate intrările sunt valide altceva // validarea a eșuat: $ erorile sunt o matrice care conține mesaje de eroare $ erori = $ model-> erori; 

Iată un exemplu de utilizare a funcției errorSummary a lui Yii în cadrul ActiveForms:

errorSummary ($ model); ?>

Iată cum arată:

Validare avansată

În episoadele ulterioare, voi da exemple de utilizare a funcțiilor avansate de validare:

  • Definirea scenariilor pentru aplicarea selectivă a regulilor pentru anumite situații
  • Definirea mesajelor personalizate de eroare
  • Evenimentele de validare pentru a suprascrie validarea sau a efectua funcționalități specifice înainte și / sau după validare
  • Condiționarea validării pentru a efectua o regulă de validare numai dacă un anumit eveniment este adevărat
  • Validarea ad hoc pentru a utiliza reguli de validare independent de depunerea formularului
  • 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

Pentru moment, să începem să vedem exemplele diferitelor tipuri de validatori încorporați.

Validatori de câmp de bază

Să ne uităm la câțiva validatori de câmpuri de bază care sunt folositori pentru implementarea formelor de zi cu zi.

Pregătirea unui model folosind migrațiile și Gii

Așa cum am făcut în episoadele timpurii din această serie, voi crea o migrație:

./ yii migrați / creați create_sample_table

Voi crea un model de exemplu pentru a crea câteva exemple de scheme și validări folosind Gii. Iată codul de migrare:

db-> driverName === 'mysql') $ tableOptions = 'SETAREA CHARACTERULUI utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('% sample', 'id' => Schema :: TYPE_PK, 'thought' => Schema :: TYPE_STRING. Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'rank' => Schema :: TYPE_INTEGER. 'NOT NULL', 'censorship' => Schema :: TYPE_STRING 'NOT NULL', 'occurred' => Schema :: TYPE_DATE. "NU NULL",], $ tableOptions);  funcția publică jos () $ this-> dropTable ('% sample'); 

Apoi, vom rula migrația:

./ yii migrați / up Instrument de migrare Yii (bazat pe Yii v2.0.2) Total 1 migrare nouă care va fi aplicată: m150219_235923_create_sample_table Aplicați migrarea de mai sus? (da: nu): da *** aplicând m150219_235923_create_sample_table> creați tabelul % sample ... făcut (timpul: 0.009s) *** aplicat m150219_235923_create_sample_table (time: 0.015s). 

Apoi, vom folosi generatorul de cod Yii pentru a construi un model:

Și apoi fișiere CRUD:

Gii generează aceste reguli de validare a eșantioanelor:

Exemplu de clasă se extinde \ yii \ db \ ActiveRecord rules of public function () return [['goodness', 'rang'], 'integer', 'rank', 'cenzura' necesar "], [['a avut loc'], 'sigur'], [['gândit', 'cenzură', 'string', 'max' => 255]]; 

Acum, hai să le folosim pentru a lucra cu și pentru a merge prin unele dintre validatorii de bază.

Validator necesar

Valoarea RequiredValidator asigură o valoare este prezentă. Puteți să-l vedeți în poziția de mai sus pentru rang, cenzură și a avut loc.

Vizitați formularul de creare a mostrei generat de Gii, de ex. http: // localhost: 8888 / Bună ziua / probă / creați. Validarea clientului ActiveForm JavaScript de către Yii va prezenta un mesaj de eroare chiar și atunci când vă deconectați de la unul dintre aceste câmpuri.

Safe Validator

SafeValidator nu este un validator valid. Permite alocarea masivă a unui formular web afișat pentru a include un atribut. de exemplu. $ model-> atributele = $ _POST ['Comentariu']. Sau, în Gii creat SampleController, puteți vedea acest cod:

funcția publică funcțiaCreate () $ model = nou exemplu (); dacă $ model-> încărcați (Yii :: $ app-> request-> post ()) && $ model-> salvați ()) return $ this-> redirect (['view', 'id' => $ Model-> id]);  altceva return $ this-> render ('crea', ['model' => $ model,]); 

Fără regulile sigure din modelul Sample (sau altă regulă), valoarea evenimentului nu ar fi atribuită atributelor modelului. Aceasta reduce probabilitatea unui vector de atac suplimentar fără un cod deliberat.

reguli de funcționare publică () return [[['occurred'], 'safe'],

Validator valoric implicit

DefaultValueValidator nu este un validator valid. Setează valorile implicite pentru câmpurile goale.

Să schimbăm regula pentru a avut loc pentru a seta o valoare de dată prestabilită folosind data curentă. De asemenea, vom elimina validatorul necesar pentru a permite validatorului implicit să umple valoarea.

regulile funcției publice () return [['goodness', 'rank'], 'integer'], ['rank', 'cenzura' ], "sigur"], ["a avut loc", "implicit", "valoare" => data ("Ymd",

Atunci când creăm un nou exemplu și lăsăm a avut loc câmp necompletat, puteți vedea afișarea rezultată include data curentă completat de validatorul valorii implicite.

Filtre

FilterValidator nu este, de asemenea, un validator valid. Efectuează o transformare pe o valoare furnizată. Cel mai frecvent, puteți utiliza acest lucru pentru a decupa spațiile goale de la capetele unui șir. 

FiltreleValidatorii sunt definite cu apeluri funcționale inline, cum ar fi această funcție de validare personalizată:

// un validator inline definit ca o funcție anonimă ['token', funcția ($ attribute, $ params) if (! ctype_alnum ($ this -> $ attribute)) $ this-> addError trebuie să conțină litere sau cifre. "); ],

Deoarece trim este o funcție nativă PHP, putem declara în regulă regula validării noastre:

 [['gîndire', 'tăiere'], 

Dacă trimiteți un formular cu spații pre-așteptate sau în picioare în câmpul de gândire, FilterValidator le va elimina.

Acum, să ne uităm la unele dintre validatoarele de tip încorporate.

Validatorii de tip

Validatorii de tip asigură că datele utilizatorului sunt conforme cu tipurile specifice, adesea cele specificate în schema de bază de date. Gii le va genera automat.

String și validator de numere

StringValidator asigură o valoare este un șir. NumărulValidator asigură o valoare numerică, de ex. întreg sau float. 

Iată exemple de reguli de eșantionare:

 regulile funcției publice () return [['goodness', 'rank'], 'integer'], [' "rang", "cenzură", "obligatoriu"], 

De asemenea, înlătur temporar validarea necesară pentru a vedea cum funcționează independența validărilor de șir și de numere.

Iată ce vor arăta mesajele de eroare de validare:

Bunăvoința la fel de mare nu reușește, deoarece nu este un număr, în timp ce rangul este de 27 de treceri. Cenzura este goală (NULL) și nu reușește validarea șirului.

boolean Validator

BooleanValidator asigură o valoare este adevărată sau falsă. Puteți defini valorile pentru true și false. Valorile implicite sunt întregi 0 sau 1. Acest validator poate fi mai util atunci când câmpul este utilizat cu un selector drop-down, de ex. Da nu.

Iată cum mi-am definit regula pentru Boolean:

 reguli de funcționare publică () return [[['goodness'], 'boolean'], [['rank'], 'integer'], 

Iată mesajul de eroare validator boolean:

Data Validator

DataValidator asigură că valoarea este o dată formatată corect, care poate fi personalizată cu un atribut format. Cu Yii ActiveForm, aceasta este în prezent o validare a serverului. Prin urmare, am adăugat, de asemenea, o regulă necesară pentru câmpul Occurred.

Iată definițiile de reguli ale mele cu validatorul de date pentru câmpul Occurtat:

regulile funcției publice () return [['goodness'], 'boolean'], [['rank'], 'integer'], => 255], [['rang', 'cenzură', 'a avut loc', 'obligatoriu'], ['a avut loc', 'data', 'format' => 'yyyy-M-d' ['a avut loc', 'implicit', 'valoare' => data ("Ymd")], [['thought'], 'trim']]; 

Iată cum arată când trimitem formularul:

Ce urmeaza?

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ătoarele două episoade, vă voi îndruma printre validatorii rămași și vă vom arăta cum să construiți extensii avansate în cadrul validării Yii.

Puteți, de asemenea, doriți să verificați starea mea Building Your Startup With PHP, care utilizează șablonul avansat al lui Yii2, pe măsură ce construiesc o aplicație din lumea reală.

Salut cererile de teme și teme. Le poți posta în comentariile de mai jos, ping-ul meu @reifman pe Twitter sau trimiteți-mi un e-mail pe site-ul meu Lookahead Consulting.

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

Link-uri conexe

  • Ghidul Yii2 pentru validarea intrărilor de utilizatori
  • Validatorii Yii2 (Documentație)
  • Yii2 Developer Exchange, site-ul meu de resurse Yii2
Cod