Hur man programmerar med Yii2 Specialiserade valideringar

Vad du ska skapa

Om du frågar, "Vad är Yii?" kolla in min tidigare handledning: Introduktion till Yii Framework, som granskar fördelarna med Yii och innehåller en översikt över vad som är nytt i Yii 2.0, släppt i oktober 2014.

I denna programmering med Yii2-serien guidar jag läsare som använder den nyuppgraderade Yii2 Framework for PHP. Denna handledning är vår andra del, tittar på Yii2s validerare. Validatorer förenklar koden som behövs för att validera inmatningen, dvs verifiera överensstämmelse eller avvikelse av dataingången, vanligtvis från användare via webbformulär. Specifikt kommer vi att utforska några av de inbyggda specialitetsvalideringarna som är vanliga för webbutveckling.

Här är en lista över de inbyggda Yii-godkännandena och länkar till dokumentation som vi ska utforska:

  • CaptchaValidator: Validerar ett CAPTCHA-formulär verifieringsfält.
  • JämförValidator: Jämför två värden från formen eller en konstant, t.ex. x måste vara mindre än 99.
  • EmailValidator: Se till att ett värde är en giltig e-postadress.
  • ExistValidator: Se till att ett värde finns i en annan tabell.
  • FileValidator: Se till att en uppladdad fil finns.
  • ImageValidator: Validerar bild- och bildegenskaper.
  • RangeValidator: Se till att ett värde ligger inom en lista över värden.
  • RegularExpressionValidator: Utför validering mot ett villkor som definieras av ett reguljärt uttryck.
  • UniqueValidator: Se till att värdet är unikt inom ett bord, till exempel en e-postadress.
  • UrlValidator: Se till att värdet är i URL-format, t.ex. http://yourdomain.com.

Jag ska vägleda dig genom exempel på var och en av dessa valideringar med hjälp av Hello Application Codebase från tidigare tutorials och ett par från vår Building Your Startup Series som också använder Yii2. Använd GitHub-länkarna på den här sidan för att få koden.

Bara en påminnelse, jag deltar i kommentera trådarna nedan. Jag är särskilt intresserad om du har ytterligare idéer eller vill föreslå ämnen för framtida handledning. Du kan också nå mig @ reifman på Twitter eller maila mig på Lookahead Consulting.

Vad är en validator?

Om du är en webbutvecklare vet du säkert att användarens inmatning inte kan lita på. Användare kan till exempel använda SQL-injektionstekniker för att försöka köra frågor som ändrar eller exponerar lösenord. Någon har en gång levererat SQL-injektion mot PHPList-installationen med öppen källkod och lyckades upptäcka ett av mina lösenord (PHPList lagrade dessa i vanlig text). Mer vanligt vill du bara se till att datanvändarna överensstämmer med typerna, blanketterna och serierna i din ansökan.

Byggvaliderare i PHP för hand tar tid. Yii Framework ger ett ton av baseline validering funktioner så det är inte nödvändigt att bygga dem från början. Men om du behöver några anpassade tillägg är det också enkelt.

Valideringar är ytterligare en anledning till att jag tycker att det alltid är vettigt att bygga applikationer på ett webbramverk som Yii istället för vanilj PHP.

I tidigare episoder har vi också pratat mycket om Yii kodgenerator, Gii. En av fördelarna med Gii är att den kommer att skriva lämpliga valideringsregler för dina modeller baserat på SQL-typdefinitionerna i schemat. Detta är en stor tidsbesparare.

Du kanske vill gå tillbaka till vår senaste episod för att läsa mer om Yii2s grundläggande typvalideringar.

Nu börjar vi titta på nästa uppsättning Yii2s inbyggda validatorer.

Nästa uppsättning av validatorer

Captcha Validator

Låt oss börja med CaptchaValidator som kontrollerar att det finns ett korrekt svar på ett CAPTCHA-verifieringsfält. CAPTCHAs hjälper till att en människa fyller i formuläret, förhoppningsvis håller automatiska skript från att skicka in den.

Här är ett exempel på Yii Captcha i aktion:

I vår Hello-kod har jag förenklat vårt formulär för att bara inkludera fältet Thought and Captcha för nu. Här är en titt på modellkodens regeldefinitioner:

klassprov utökar \ yii \ db \ ActiveRecord public $ captcha; / ** * @inheritdoc * / public function rules () return [[['tänk'], 'sträng', 'max' => 255], [['tanke'], 'trim'], [[' tanke "]," krävs "], [[captcha]]," captcha "],]; 

Den captcha ingår inte i vårt databasschema. Det används endast för att verifiera formuläret. Därför har jag lagt till ett attribut till modellen för det, t.ex.. offentlig $ captcha;.

Här är visningskoden för formuläret. Vi måste inkludera Captcha-biblioteket högst upp.

 
errorSummary ($ modell); ?> fält ($ modell, "tanke") -> textInput (['maxlength' => 255])?> fält ($ model, captcha) -> widget (\ yii \ captcha \ Captcha :: classname (), [// konfigurera ytterligare widget egenskaper här])>
isNewRecord? 'Skapa': 'Uppdatering', ['class' => $ model-> isNewRecord? 'btn btn-success': 'btn btn-primary'])?>

Så här ser Captcha-valideringen ut i åtgärd:

Om du klickar på Captcha kommer Yii att generera en ny bild.

Jämföringsvalideraren

Nu, låt oss gå vidare till CompareValidator. Denna validator jämför två värden från formuläret eller ett enda formvärde till en konstant, till exempel x måste vara mindre än 99.

För det här exemplet vill jag se till att användarinmatningen för rank är större än noll men mindre än eller lika med 100.

Först lägger jag till inmatningsfältet tillbaka till vårt formulär för rankattributet:

 errorSummary ($ modell); ?> fält ($ modell, "tanke") -> textInput (['maxlength' => 255])?> fält ($ modell, 'rank') -> textInput ()?> fält ($ model, captcha) -> widget (\ yii \ captcha \ Captcha :: classname (), [// konfigurera ytterligare widget egenskaper här])> 

Sedan lägger jag till två jämförelsevalideringsregler till vår modell:

 allmänna funktionsregler () return [[['thought'], 'string', 'max' => 255], [['tanke'], 'trim'], [['tänk'], 'krävs'] , ['captcha'], 'captcha'], [['rank'], 'heltal'], ['rank', 'jämför', 'compareValue' => 0, 'operator' => '>'] , ['rank', 'jämför', 'compareValue' => 100, 'operator' => '<='], ];  

Du kan se en fullständig lista över tillgängliga jämförande operatörer här.

Så här ser vår form ut när användaren skickar ett ogiltigt attribut:

Om vi ​​vill ge de specifika begränsningsreglerna i ett felmeddelande tillåter Yii Validators dig att anpassa felet som visas till användaren, så här:

Genomförandet av detta är ganska enkelt med tillägget av meddelandeattributet:

allmänna funktionsregler () return [[['thought'], 'string', 'max' => 255], [['tanke'], 'trim'], [['tänk'], 'krävs'] , ['captcha'], 'captcha'], [['rank'], 'heltal'], ['rank', 'jämför', 'compareValue' => 0, 'operator' => '>' 'message' => Yii :: t ('app', 'Rank måste vara mellan 0 och 100 inklusive.')], ['rank', 'compare', 'compareValue' => 100, 'operator' => '<=','message'=>Yii :: t ('app', 'Rank måste vara mellan 0 och 100 inklusive.')],]; 

Uppdaterar vårt schema för att testa fler valideringar

För några av dessa nästa valideringstest kommer jag att be dig lägga till några fält i databasen.

I \ migreringar \ m150219_235923_create_sample_table.php, vi lägger till några nya fält för att testa nästa uppsättning validatorer: e-postadress, webbadress, filnamn etc.

$ this-> createTable ('sample', ['id' => Schema :: TYPE_PK, 'thought' => Schema :: TYPE_STRING. 'INTE NULL DEFAULT "", "goodness" => Schema :: TYPE_SMALLINT. 'INTE NULLSTÄLLNING 0', 'rank' => Schema :: TYPE_INTEGER. 'INTE NULL', 'censur' => Schema :: TYPE_STRING. 'INTE NULL', 'inträffat' => Schema :: TYPE_DATE 'NOT NULL', 'email' => Schema :: TYPE_STRING. 'INTE NULL DEFAULT ""', 'url' => Schema :: TYPE_STRING. 'INTE NULL DEFAULT ""', 'filnamn' => Schema :: TYPE_STRING. 'NOT NULL', 'avatar' => Schema :: TYPE_STRING. 'NOT NULL',], $ tableOptions); 

Kör sedan migreringen ner för att släppa tabellen och sedan upp:

Admins-MBP: hej Jeff $ ./yii migrera / ner 1 Yii Migrationsverktyg (baserat på Yii v2.0.2) Totalt 1 migrering som ska återställas: m150219_235923_create_sample_table Återställ ovanstående migration? (ja | nej) nej: ja *** återgår m150219_235923_create_sample_table> droppbord % sample ... gjort (tid: 0.002s) *** återgår m150219_235923_create_sample_table (tid: 0.005s) Migrerad ner framgångsrikt. Admins-MBP: hej Jeff $ ./yii migrera / upp 1 Yii Migration Tool (baserat på Yii v2.0.2) Totalt 1 ny migration som ska tillämpas: m150219_235923_create_sample_table Använd ovanstående migration? (ja | nej) nej: ja *** tillämpa m150219_235923_create_sample_table> skapa bord % sample ... gjort (tid: 0.007s) *** tillämpas m150219_235923_create_sample_table (tid: 0.010s) Migrerad framgångsrikt.

Vi är nu redo att testa e-postadresserna och URL-valideringsmedlemmarna.

Validatorer för e-postadress och URL

EmailValidator ser till att ett värde är en giltig e-postadress och UrlValidator ser till att ett värde är i URL-format, t.ex. http://yourdomain.com. 

Det är ganska enkelt att skapa regler för våra nya e-postadresser och webbadressfält:

 allmänna funktionsregler () return [[['tänk'], 'sträng', 'max' => 255], [['email'], 'email'], [['url'], 'url'], 

Här är visningskoden för formuläret. Observera hur jag använder anpassade etiketter för att förbättra formulärets användbarhet:

errorSummary ($ modell); ?> fält ($ modell, "tanke") -> textInput (['maxlength' => 255])?> fält ($ model, 'email') -> textInput () -> etikett (Yii :: t ('app', 'Din e-postadress'))> fält ($ modell, 'url') -> textInput () -> etikett (Yii :: t ('app', 'Din hemsida'))>

Här är validatorerna i aktion:

Dessa är uppenbarligen mycket användbara för webbapplikationer.

Den existerande validatorn

ExistValidator är super användbart i vissa scenarier. Det kan säkerställa att ett värde finns i en annan tabell. Och det kan användas på olika sätt - här finns några exempel i dokumentationen:

// a1 måste existera ['a1', 'exist'] // a1 måste existera, men dess värde kommer att använda a2 för att kontrollera existensen ['a1', 'exist', 'targetAttribute' => 'a2' ] // a1 och a2 måste existera tillsammans, och de båda kommer att få ett felmeddelande [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1', 'a2']] // a1 och a2 måste existera tillsammans kommer endast a1 att få felmeddelande ['a1', 'exist', 'targetAttribute' => ['a1', 'a2']] // a1 måste existera genom att kontrollera förekomsten av båda a2 och a3 (med a1-värde) ['a1', 'exist', 'targetAttribute' => ['a2', 'a1' => 'a3']]

Yii dokumentationen belyser att Exist kan användas för att "verifiera att en främmande nyckel innehåller ett värde som finns i det utländska bordet."

För vårt exempel kommer jag att skapa en regel som kontrollerar att e-postadressen i formuläret redan finns i vårt registrerade användartabell. För att göra detta använder vi targetClass som berättar Yii vilken klass (eller modell tabell) för att leta upp användarens e-postadress för validering. 

Här är regeldefinitionen - noteringen av vår användarmodell högst upp:

 255], [['email'], 'email'], [['email'], 'exist', 'targetClass' => '\ app \ models \ Användare', 'message' => Yii :: t 'app', 'Tyvärr, den personen har inte registrerats än')], [['url'], 'url'],

Det instruerar Yii att fråga användartabellen för att se till att den angivna e-postadressen matchar en tidigare registrerad användare.

Det här ser ut som om det verkar:

Du kan lära dig mer om existerande validering och dess permutationer här.

Fil- och bildvaliderarna

Därefter visar jag exempel på FileValidator, som säkerställer existens, MIME-typ och storlek på en uppladdad fil och ImageValidator som validerar bilden och dess egenskaper.

För att utforska fil- och bildgodkännare, låt oss se på ett exempel från Bygga din start med PHP-serien: Användarinställningar, Profilbilder och Kontaktuppgifter. I det avsnittet i UserSettings-modellen tillåter vi användare att ladda upp en fil för sin profilbild.

Bildattributet accepterar den uppladdade filen:

 allmänna funktionsregler () return [[['user_id',], 'required'], [['user_id',], 'unique'], [['bild'], 'säker'], [['' bild '', 'fil', 'extensions' => 'jpg, gif, png'], [['' bild '],' fil ',' maxSize '=>' 100000 '], [' bild ' , 'extensions' => 'png, jpg, gif', 'minWidth' => 100, 'maxWidth' => 400, 'minHeight' => 100, 'maxHeight' => 400,], 

FileValidators ser till att bilden slutar i en riktig bildförlängning och är mindre än 100 000 byte. 

ImageValidator verifierar också förlängningstypen samt bredd och höjdintervall för bilden.

Här är ett exempel på fel som genereras genom att ladda upp en bild vars dimensioner är större än 400 x 400 pixlar:

Det är min assistent ovanför som brukade kopiera mina handledning.

Räckvidd i Validator

Det finns också RangeValidator som garanterar att ett värde ligger inom en lista över tillåtna poster. 

För vårt exempel, lägg till fältet för censur tillbaka i formuläret:

errorSummary ($ modell); ?> fält ($ modell, "tanke") -> textInput (['maxlength' => 255])?> fält ($ model, 'email') -> textInput () -> etikett (Yii :: t ('app', 'Din e-postadress'))> fält ($ modell, 'url') -> textInput () -> etikett (Yii :: t ('app', 'Din hemsida'))> fält ($ modell, censur)) -> textInput ()?> fält ($ modell, 'rank') -> textInput ()?> fält ($ model, captcha) -> widget (\ yii \ captcha \ Captcha :: classname (), [// konfigurera ytterligare widget egenskaper här])>

Sedan lägger vi till en RangeValidator för att matcha svaret på en ja eller Nej sträng:

 allmänna funktionsregler () return [[['tänk'], 'sträng', 'max' => 255], ['tanke', 'match', 'mönster' => '/ ^ [az] Za-z,; \ "\\ s] + [!?.] $ / I ',' message '=> Yii :: t (' app ',' Dina tankar ska utgöra en komplett mening med alfabetiska tecken. ') ], [email]], [['email'], 'exist', 'targetClass' => '\ app \ models \ Användare', 'message' => Yii :: t app ',' Sorry, den personen har inte registrerats än ')], [[' url '],' url '], [' censur ',' i ',' range '=> [' ja ' nej ',' Ja ',' Nej '],' Meddelande '=> Yii :: t (' app ',' Censorerna kräver ett ja eller inget svar. ')],

Här är ett exempel på RangeValidator i åtgärd:

Regular Expression Match Validator

Låt oss nu titta på RegularExpressionValidator, som utför validering mot ett villkor som definieras av ett reguljärt uttryck. 

I vårt exempel använder jag följande regex för att matcha fullständiga meningar med alfabetiska tecken. Detta betyder att de måste sluta med antingen (!,? Eller.) Och har inga numeriska tecken.

 allmänna funktionsregler () return [[['tänk'], 'sträng', 'max' => 255], ['tanke', 'match', 'mönster' => '/ ^ [az] Za-z,; \ "\\ s] + [!?.] $ / I ',' message '=> Yii :: t (' app ',' Dina tankar ska utgöra en komplett mening med alfabetiska tecken. ') ], 

Här är ett exempel på användarinmatning som misslyckas med testet på grund av siffrorna och avsaknaden av ett efterföljande skiljetecken:

Här är en giltig mening:

Du kanske också är intresserad av åtta regelbundna uttryck du bör veta (Tuts +) som en referens för vanliga regexmönster.

Den unika valideraren

Låt oss slutligen granska UniqueValidator, vilket säkerställer att ett värde är unikt inom ett bord, till exempel en e-postadress eller en slug.

Jag granskade SluggableBehavior tidigare i denna serie, som erbjuder sitt eget inbyggda unika stöd. Låt oss dock titta på några fler exempel från Building Your Startup With PHP-serien. 

I kodbasen för mötesplaneraren (från de senaste tutorial-episoderna) i platsmodellen (\ frontend \ modeller \ Place.php) använder vi den unika validatorn på flera sätt:

public function rules () return [[['name', 'slug'], 'required'], [['place_type', 'status', 'created_by', 'created_at', 'updated_at'], 'integer' ], [['namn', 'google_place_id', 'slug', 'website', 'full_address', 'vicinity'], 'sträng', 'max' => 255], [['webbplats'] '], [[' slug '],' unikt '], [[' searchbox '],' unikt ',' targetAttribute '=>' google_place_id '], [[' namn ',' full_address '], "unikt" , 'targetAttribute' => ['namn', 'full_adress']],]; 

Först använder vi den unika regeln med slugen för att öka SluggableBehavior, vilket är överflödigt. men du kan se valideringsformatet.

För det andra kontrollerar vi att resultaten i sökrutan för Google Places Autofullständig resulterar i det dolda fältet för google_place_id att vara unik eftersom den ännu inte finns i tabellen Places. Vi förhindrar i huvudsak dubbla Google Place-ID. 

Den betydande delen av detta är att Yii2s unika validator gör det möjligt för oss att driva unika på det synliga fältet (sökruta) Medan du validerar den i den sekundära kolumnen som returneras via AJAX från Google (google_place_id).

För det tredje garanterar vi det namn och hela adressen är unika tillsammans. Med andra ord är dubblerade platsnamn okej. Det kan finnas en bazillion Starbucks. Men vi vill inte att någon kommer in på samma Starbucks plats två gånger.

Notera: Starbucks kaffe är inte ett effektivt stimulansmedel för programutvecklare. Jag uppmuntrar dig till ofta oberoende caféer.

Här är ett exempel på detta i åtgärd:

Vad kommer härnäst?

Jag hoppas att du håller med om hur enkla och användbara Yii2-validatorer är för webbutveckling. Jag kan helt enkelt inte föreställa mig någonsin att återvända till vanilj PHP-utveckling utan hjälp av en ram.

Titta på kommande handledningar i min programmering med Yii2-serien när jag fortsätter att dyka in i olika aspekter av ramen. I nästa avsnitt ska jag granska Yii2s avancerade valideringsfunktioner som:

  • Villkorlig validering för att endast utföra en valideringsregel om en viss händelse är sann
  • Anpassade validatorer för att skapa viktiga valideringar utöver vad Yii erbjuder ur lådan
  • Validering av klientsidan för att utnyttja Yiis inbyggda ActiveForm JavaScript-validering utan att behöva uppdatera sidan
  • AJAX-validering för att implementera server-AJAX-valideringar för att utöka Yi: s JavaScript-valideringskapacitet på klientsidan.
  • Valideringshändelser för att åsidosätta validering eller utföra specifik funktionalitet före och / eller efter validering
  • Definiera scenarier för att selektivt tillämpa regler för vissa situationer
  • Ad hoc-validering för att använda valideringsregler oberoende av formulärinsändning

Jag välkomnar funktion och ämnesförfrågningar. Du kan posta dem i kommentarerna nedan, nå ut till mig @ reifman på Twitter, eller maila mig på Lookahead Consulting.

Om du vill veta när nästa Yii2 handledning kommer, kan du också kolla min Tuts + instruktörssida. Det innehåller alltid länkar till mina artiklar omedelbart efter publicering.

relaterade länkar

  • Yii2 Guide till validering av användarinmatning
  • Yii2 Guide till Core Validators
  • Yii2-validatorer (dokumentation)
  • Yii2 Developer Exchange, min egen Yii2 resurs webbplats