Hoe te programmeren met Yii2 Validaties

Wat je gaat creëren

Als je vraagt: "Wat is Yii?" bekijk mijn eerdere tutorial: Introductie tot het Yii Framework, die de voordelen van Yii bekijkt en een overzicht bevat van wat er nieuw is in Yii 2.0, uitgebracht in oktober 2014.

In deze serie Programming With Yii2 begeleid ik lezers in gebruik van het onlangs bijgewerkte Yii2 Framework voor PHP. In deze tutorial ga ik je voorstellen aan de validators van Yii2. Validators vereenvoudigen de code die nodig is om invoer te valideren, d.w.z. conformiteit of niet-conformiteit van gegevensinvoer te verifiëren, typisch van gebruikers via webformulieren.

Voor deze voorbeelden blijven we gebruikmaken van de codebase van de Hello-toepassing die we in eerdere zelfstudies hebben gebruikt. Gebruik de GitHub-links op deze pagina om de code te krijgen.

Ter herinnering, ik neem wel deel aan de commentaarthreads hieronder. Ik ben vooral geïnteresseerd als je aanvullende ideeën hebt of onderwerpen wilt voorstellen voor toekomstige zelfstudies. Je kunt me ook bereiken @reifman op Twitter. 

Wat is een Validator?

Als u een webontwikkelaar bent, weet u waarschijnlijk dat gebruikersinvoer niet vertrouwd kan worden. Gebruikers kunnen bijvoorbeeld SQL-injectietechnieken gebruiken om te proberen query's uit te voeren die wachtwoorden wijzigen of ontmaskeren. Iemand gebruikte ooit een SQL-injectie tegen mijn open source PHPList-installatie en wist een van mijn wachtwoorden te achterhalen (PHPList heeft deze in gewone tekst opgeslagen). Meestal wilt u er alleen voor zorgen dat de gegevens die gebruikers leveren, overeenkomen met de typen, vormen en bereiken van uw toepassing.

Validators bouwen met de hand in PHP kost tijd. Het Yii Framework biedt een heleboel basislijnvalidatiefuncties, dus u hoeft ze niet vanaf nul te bouwen. Maar als u een aantal aangepaste extensies nodig hebt, is dat ook eenvoudig.

Validaties zijn nog een andere reden waarom ik denk dat het altijd zinvol is om applicaties te bouwen op een web framework zoals Yii in plaats van vanilla PHP.

In eerdere afleveringen hebben we ook veel gesproken over Yii's codegenerator, Gii. Een van de voordelen van Gii is dat het de juiste validatieregels voor uw modellen zal schrijven op basis van de definities van het SQL-type in het schema. Dit bespaart veel tijd.

Welke validaties worden door Yii ondersteund??

Hier is een lijst van de ingebouwde Yii-validators en links naar documentatie:

  • BooleanValidator. Zorgt ervoor dat een waarde waar of onwaar is.
  • CaptchaValidator. Valideert een CAPTCHA-formulierverificatieveld.
  • CompareValidator. Vergelijkt twee waarden van de vorm of een constante, b.v. x moet kleiner zijn dan 99.
  • DateValidator. Waarborgt dat waarde een datum is.
  • DefaultValueValidator. Geen echte validator. Stelt standaardwaarden in voor lege velden.
  • NumberValidator. Zorgt ervoor dat een waarde numeriek is, bijv. integer of float.
  • EmailValidator. Zorgt ervoor dat een waarde een geldig e-mailadres is.
  • ExistValidator. Zorgt ervoor dat een waarde bestaat in een andere tabel.
  • FileValidator. Zorgt voor het bestaan ​​van een geüpload bestand.
  • FilterValidator. Geen echte validator. Voert een transformatie uit op geleverde waarde.
  • ImageValidator. Valideert afbeelding en afbeeldingseigenschappen.
  • RangeValidator. Zorgt ervoor dat een waarde binnen een lijst met waarden valt.
  • RegularExpressionValidator. Voert validatie uit tegen een voorwaarde die is gedefinieerd door een reguliere expressie.
  • RequiredValidator. Zorgt ervoor dat een waarde aanwezig is.
  • SafeValidator. Geen echte validator. Staat massale toewijzing toe van een geplaatst webformulier om een ​​attribuut op te nemen. bijv. $ model-> attributen = $ _POST ['Reactie'];
  • StringValidator. Waarborgt dat waarde een reeks is.
  • UniqueValidator. Waarborgt dat waarde uniek is binnen een tabel, zoals een e-mailadres.
  • UrlValidator. Waarborgt dat de waarde in het URL-formaat is b.v. http://yourdomain.com

Hoe Yii-validatie werkt

Hier is hoe Yii de stroom van validatie beschrijft. Meestal kunt u het standaardscenario gebruiken en hoeft u uw eigen scenario niet te maken. U zult over het algemeen op Gii moeten vertrouwen om regels te genereren of uw eigen regels te schrijven.

Wanneer de valideren () methode wordt aangeroepen, voert het de volgende stappen uit om validatie uit te voeren:

  1. Bepaal welke attributen moeten worden gevalideerd door de attribuutlijst uit yii \ base \ Model :: scenario's () te halen met behulp van het huidige scenario. Deze attributen worden genoemd actieve attributen.
  2. Bepaal welke validatieregels moeten worden gebruikt door de regellijst te halen uit yii \ base \ Model :: rules () met behulp van het huidige scenario. Deze regels worden genoemd actieve regels
  3. Gebruik elke actieve regel om elk actief kenmerk te valideren dat aan de regel is gekoppeld. De validatieregels worden geëvalueerd in de volgorde waarin ze worden vermeld.

Volgens de bovenstaande validatiestappen zal een attribuut worden gevalideerd als en alleen als het een actief attribuut is dat wordt gedeclareerd in scenario () en is gekoppeld aan een of meerdere actieve regels die zijn gedeclareerd in reglement().

Voorbeeld van modelvalidatieregels

Hier is wat een set modelvalidatieregels eruit zou kunnen zien. Ik heb deze overgenomen uit de Meeting Planner-toepassing Plaatsmodel:

 public function rules () return [['naam', 'slug'], 'required'], [['place_type', 'status', 'created_by', 'created_at', 'updated_at'], 'integer' ], [['naam', 'google_place_id', 'slug', 'website', 'full_address', 'vicinity'], 'string', 'max' => 255], [['' website '],' url '], [[' slug '],' uniek '], [[' zoekvak '],' uniek ',' targetAttribute '=>' google_place_id '], [[' naam ',' volledig_adres '],' uniek ' , 'targetAttribute' => ['name', 'full_address']],]; 

Naarmate we onze eigen validatievoorbeelden hieronder verder implementeren, leert u wat elk van de bovenstaande definities vertegenwoordigt.

Voorbeeld van het weergeven van fouten

Er zijn een aantal manieren om toegang te krijgen tot de fouten die door de validatie worden geretourneerd. 

Hier is een voorbeeld van het ophalen van de reeks fouten in de controller:

$ model = nieuwe \ app \ modellen \ ContactForm; // vul modelattributen met gebruikersinvoer $ model-> attributes = \ Yii :: $ app-> request-> post ('ContactForm'); if ($ model-> validate ()) // alle ingangen zijn geldig else // validatie mislukt: $ errors is een array met foutmeldingen $ errors = $ model-> errors; 

En hier is een voorbeeld van het gebruik maken van de errorSummary-functie van Yii in ActiveForms:

errorSummary ($ model); ?>

Hier is hoe het eruit ziet:

Gevorderde validatie

In latere afleveringen zal ik ook voorbeelden geven van het gebruik van geavanceerde validatiefuncties:

  • Scenario's definiëren om selectief regels voor bepaalde situaties toe te passen
  • Aangepaste foutmeldingen definiëren
  • Validatiegebeurtenissen om validatie op te heffen of specifieke functionaliteit uit te voeren vóór en / of na validatie
  • Voorwaardelijke validatie om alleen een validatieregel uit te voeren als een specifieke gebeurtenis waar is
  • Ad-hocvalidatie om validatieregels te gebruiken onafhankelijk van formulierinzending
  • Aangepaste validators om essentiële validaties te creëren die verder gaan dan wat Yii out of the box biedt
  • Validatie van clientzijde om gebruik te maken van de ingebouwde ActiveForm JavaScript-validatie van Yii zonder dat een vernieuwing van de pagina vereist is
  • AJAX-validatie voor het implementeren van AJAX-validaties aan de serverkant om de JavaScript-pagina validatiemogelijkheden aan de clientzijde van Yii uit te breiden

Laten we voor nu beginnen met het doorlopen van voorbeelden van de verschillende soorten ingebouwde validators.

Basic Field Validators

Laten we eens kijken naar enkele van de basisveldvalidators die nuttig zijn bij de implementatie van alledaagse formulieren.

Een model voorbereiden met behulp van migraties en Gii

Zoals we in eerdere afleveringen van deze serie hebben gedaan, ga ik een migratie maken:

./ yii migreren / create_sample_table maken

Ik maak een voorbeeldmodel om een ​​voorbeeldschema en validaties te maken met Gii. Dit is de migratiecode:

db-> driverName === 'mysql') $ tableOptions = 'KARAKTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('% sample', ['id' => Schema :: TYPE_PK, 'thought' => Schema :: TYPE_STRING. 'NOT NULL DEFAULT ""', 'goedheid' => 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'); 

Vervolgens voeren we de migratie uit:

./ yii migreren / omhoog Yii Migration Tool (gebaseerd op Yii v2.0.2) Totaal 1 nieuwe migratie die moet worden toegepast: m150219_235923_create_sample_table Pas de bovenstaande migratie toe? (ja | nee) [nee]: ja *** toepassen m150219_235923_create_sample_table> tabel maken % sample ... klaar (tijd: 0.009s) *** toegepast m150219_235923_create_sample_table (tijd: 0.015s) Migratie succesvol uitgevoerd. 

Vervolgens gebruiken we Yii's codegenerator om een ​​model te bouwen:

En dan CRUD-bestanden:

Gii genereert deze voorbeeldvalidatieregels:

class Sample extends \ yii \ db \ ActiveRecord public function rules () return [[['goodness', 'rank'], 'integer'], [['rank', 'censorship', 'voorgekomen'], ' vereist '], [[' voorgekomen '],' veilig '], [[' gedachte ',' censuur '],' string ',' max '=> 255]]; 

Laten we deze nu gebruiken om met enkele van de basisvalidators te werken en deze te doorlopen.

Vereist Validator

De RequiredValidator zorgt ervoor dat een waarde aanwezig is. Je kunt het hierboven op zijn plaats zien voor rang, censuur en gebeurde.

Ga naar de voorbeeldaanmaak die is gegenereerd door Gii, bijvoorbeeld http: // localhost: 8888 / hallo / sample / creëren. Yii's ActiveForm JavaScript-clientvalidatie zal een foutmelding geven, zelfs wanneer u weg wegtikt van een van deze velden.

Safe Validator

De SafeValidator is geen echte validator. Het staat massale toewijzing van een geplaatst webformulier toe met een attribuut. bijv. $ model-> attributen = $ _POST ['Reactie']. Of, in de Gii gemaakt SampleController, kunt u deze code zien:

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

Zonder de veilige regel in het voorbeeldmodel (of een andere regel), zou de opgetreden waarde niet worden toegewezen aan de modelattributen. Dit verkleint de waarschijnlijkheid van een extra aanvalsvector zonder opzettelijke code.

regels voor openbare functies () return [['aanwezig'], 'veilig'],

Standaardwaarde Validator

De DefaultValueValidator is geen echte validator. Het stelt standaardwaarden in voor lege velden.

Laten we de regel wijzigen heeft plaatsgevonden om een ​​standaard datumwaarde in te stellen met de huidige datum. We zullen ook de vereiste validator verwijderen om de standaardvalidator de waarde te laten invullen.

public function rules () return [[['goodness', 'rank'], 'integer'], [['rank', 'censorship'], 'required'], // Gii heeft dit // [['gemaakt voorgekomen '],' veilig '], [' voorgekomen ',' standaard ',' waarde '=> datum ("Ymd")],

Wanneer we een nieuwe sample maken en de heeft plaatsgevonden veld leeg, kunt u zien dat de resulterende weergave de huidige datum bevat die is ingevuld door de standaardwaardevalidator.

filters

De FilterValidator is ook geen echte validator. Het voert een transformatie uit op een opgegeven waarde. Meestal kunt u dit gebruiken om de witruimte van de uiteinden van een tekenreeks in te korten. 

FilterValidators worden gedefinieerd met inline-functie-callbacks, zoals deze aangepaste validatiefunctie:

// een inline validator gedefinieerd als een anonieme functie ['token', function ($ attribute, $ params) if (! ctype_alnum ($ this -> $ attribute)) $ this-> addError ($ attribute, 'The token moet letters of cijfers bevatten. '); ],

Aangezien trim een ​​native PHP-functie is, kunnen we onze validatieregel gewoon inline verklaren:

 [['' gedachte '],' trim '], 

Als u een formulier indient met vooraf hangende of volgspaties in het denkveld, verwijdert de FilterValidator ze.

Laten we nu kijken naar enkele van de ingebouwde validators van het type.

De typevalidators

Type validators zorgen ervoor dat gebruikersgegevens voldoen aan specifieke typen, vaak die gespecificeerd in uw databaseschema. Gii zal deze automatisch genereren.

String en nummervalidator

De StringValidator zorgt ervoor dat een waarde een tekenreeks is. De NumberValidator zorgt ervoor dat een waarde numeriek is, b.v. integer of float. 

Dit zijn voorbeeldregeldefinities:

 public function rules () return [[['goodness', 'rank'], 'integer'], [['thought', 'censorship'], 'string', 'max' => 255] // [[ 'rang', 'censuur'], 'vereist'], 

Ik verwijder ook tijdelijk de vereiste validatie om te zien hoe string- en nummervalidaties onafhankelijk werken.

Dit is hoe de validatiefout eruit zal zien:

Goedheid als hoog mislukt omdat het geen getal is, terwijl het rangschikt als 27 passen. Censuur is blanco (NULL) en mislukt de stringvalidatie.

Boolean Validator

De BooleanValidator zorgt ervoor dat een waarde waar of onwaar is. U kunt de waarden voor waar en onwaar definiëren. De standaardwaarden zijn geheel 0 of 1. Deze validator kan handiger zijn als het veld wordt gebruikt met een vervolgkeuzekiezer, bijvoorbeeld Ja nee.

Hier is hoe ik mijn regel voor Boolean heb gedefinieerd:

 public function rules () return [['goodness'], 'boolean'], [['rank'], 'integer'], 

Hier is de Boolean validator-foutmelding:

date Validator

De DateValidator zorgt ervoor dat de waarde een correct geformatteerde datum is die kan worden aangepast met een formatattribuut. Met Yii ActiveForm is dit momenteel een validatie aan de serverzijde. Daarom heb ik ook een vereiste regel toegevoegd voor het veld Occurred.

Dit zijn mijn regeldefinities met de datumvalidator voor het veld Occurred:

public function rules () return [['goodness'], 'boolean'], [['rank'], 'integer'], [['thought', 'censorship'], 'string', 'max' => 255], [['rang', 'censuur', 'voorgekomen'], 'vereist'], ['voorgekomen', 'datum', 'formaat' => 'yyyy-M-d'], // ['voorgekomen', 'standaard', 'waarde' => datum ("Ymd")], [['thought'], 'trim'],]; 

Zo ziet het eruit wanneer we het formulier verzenden:

Wat is het volgende?

Kijk uit naar komende tutorials in mijn Programming With Yii2-serie terwijl ik verder duik in verschillende aspecten van het framework. In de volgende twee afleveringen zal ik je door de overgebleven validators leiden en laten zien hoe je geavanceerde extensies kunt bouwen in Yii's validatiekader..

Je kunt ook mijn Building Your Startup With PHP-serie bekijken, die de geavanceerde sjabloon van Yii2 gebruikt terwijl ik een toepassing in de echte wereld samenstel.

Ik verwelkom aanvragen voor functies en onderwerpen. Je kunt ze plaatsen in de reacties hieronder, me pingen @reifman op Twitter of me e-mailen op mijn Lookahead Consulting-website.

Als je wilt weten wanneer de volgende Yii2-tutorial arriveert, kijk dan op mijn Tuts + instructeur-pagina. Het bevat altijd al mijn artikelen onmiddellijk nadat ze zijn gepubliceerd. 

Gerelateerde Links

  • Yii2 Gids voor validatie van gebruikersinvoer
  • Yii2 Validators (documentatie)
  • Yii2 Developer Exchange, mijn Yii2-bronsite