Hur man programmerar med Yii2 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. I denna handledning kommer jag att presentera dig för 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.

För dessa exempel fortsätter vi att utnyttja Hello Application-kodbasen som vi har använt i tidigare handledning. 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. 

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 de data som användare tillhandahåller överensstämmer med typerna, formerna 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.

Vilka Valideringar Stödjer Yii?

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

  • BooleanValidator. Se till att ett värde är sant eller felaktigt.
  • CaptchaValidator. Validerar ett CAPTCHA formulär verifiering fält.
  • CompareValidator. Jämförer två värden från formen eller en konstant, t.ex. x måste vara mindre än 99.
  • DateValidator. Se till att värdet är ett datum.
  • DefaultValueValidator. Inte en sann validator. Ställer in standardvärden för tomma fält.
  • NumberValidator. Säkerställer att ett värde är numeriskt, t.ex. heltal eller float.
  • EmailValidator. Se till att ett värde är en giltig e-postadress.
  • ExistValidator. Säkerställer att ett värde finns i en annan tabell.
  • FileValidator. Säkerställer att en uppladdad fil finns.
  • FilterValidator. Inte en sann validator. Utför en transformation på angivet värde.
  • 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.
  • RequiredValidator. Se till att ett värde är närvarande.
  • SafeValidator. Inte en sann validator. Tillåter massiv tilldelning av en upplagd webbformulär för att inkludera ett attribut. t.ex. $ model-> attribut = $ _POST ['Kommentar'];
  • StringValidator. Se till att värdet är en sträng.
  • 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

Hur Yii-validering fungerar

Så här beskriver Yii flödet av validering. Vanligtvis kan du använda standardscenariot och behöver inte bygga ditt eget. Du behöver i allmänhet förlita dig på Gii för att skapa regler eller skriva egna.

När bekräfta() Metoden heter, det går igenom följande steg för att utföra validering:

  1. Bestäm vilka attribut som ska valideras genom att få attributlistan från yii \ base \ Model :: scenarios () med det aktuella scenariot. Dessa attribut heter aktiva attribut.
  2. Bestäm vilka valideringsregler som ska användas genom att få regellistan från yii \ base \ Model :: rules () med det aktuella scenariot. Dessa regler kallas aktiva regler
  3. Använd varje aktiv regel för att validera varje aktivt attribut som är associerat med regeln. Valideringsreglerna utvärderas i den ordning de anges.

Enligt ovanstående valideringssteg kommer ett attribut att valideras om och endast om det är ett aktivt attribut deklarerat i scenarier () och är associerad med en eller flera aktiva regler som deklarerats i regler ().

Exempel på modellvalideringsregler

Här är vad en uppsättning modellvalideringsregler kan se ut. Jag har tagit dessa från mötesplaneringsprogrammet Platsmodell:

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

När vi genomför våra egna valideringsexempel längre fram kommer du att lära dig vad varje definition av ovanstående representerar.

Exempel på att visa fel

Det finns ett par sätt att få åtkomst till de fel som returneras genom validering. 

Här är ett exempel på att få en rad fel i kontrollenheten:

$ model = new \ app \ models \ ContactForm; // populera modellattribut med användarinputs $ model-> attributes = \ Yii :: $ app-> request-> post ('ContactForm'); om ($ modell-> validera ()) // alla inmatningar är giltiga annat // validering misslyckades: $ fel är en array som innehåller felmeddelanden $ errors = $ model-> errors; 

Och här är ett exempel på att utnyttja Yiis errorSummary-funktion inom ActiveForms:

errorSummary ($ modell); ?>

Så här ser det ut:

Avancerad validering

I senare avsnitt kommer jag också att ge exempel på att använda avancerade valideringsfunktioner:

  • Definiera scenarier för att selektivt tillämpa regler för vissa situationer
  • Definiera anpassade felmeddelanden
  • Valideringshändelser för att åsidosätta validering eller utföra specifik funktionalitet före och / eller efter validering
  • Villkorlig validering för att endast utföra en valideringsregel om en viss händelse är sann
  • Ad hoc-validering för att använda valideringsregler oberoende av formulärinsändning
  • 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

För nu, låt oss börja gå igenom exempel på olika typer av inbyggda validatorer.

Basic Field Validators

Låt oss titta på några av de grundläggande fältvaliderarna som är till hjälp för vardaglig formgivning.

Förbereda en modell med hjälp av migreringar och Gii

Som vi har gjort i tidiga episoder av den här serien, kommer jag att skapa en migrering:

./ yii migrera / skapa create_sample_table

Jag skapar en provmodell för att skapa några exempel scheman och valideringar med hjälp av Gii. Här är migreringskoden:

db-> drivrutinName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('sample', ['id' => Schema :: TYPE_PK, 'thought' => Schema :: TYPE_STRING. 'INTE NULL DEFAULT " Schema :: TYPE_SMALLINT. 'INTE NULLSTÄLLNING 0', 'rank' => Schema :: TYPE_INTEGER. 'INTE NULL', 'censur' => Schema :: TYPE_STRING. 'NOT NULL', 'skett' => Schema :: TYPE_DATE. 'NOT NULL',], $ tableOptions);  offentlig funktion ner () $ this-> dropTable ('sample'); 

Sedan kör vi migreringen:

./ yii migrera / upp Yii Migrationsverktyg (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ämpning m150219_235923_create_sample_table> skapa bord % sample ... gjort (tid: 0.009s) *** tillämpas m150219_235923_create_sample_table (tid: 0.015s) Migrerad framgångsrikt. 

Sedan använder vi Yii kodgenerator för att bygga en modell:

Och sedan CRUD-filer:

Gii genererar dessa provvalideringsregler:

klassprov utökar \ yii \ db \ ActiveRecord public function rules () return [[[['godhet', 'rank'], 'heltal'], [['rank', 'censur' krävs '], [[' inträffat '],' säkert '], [[' tanke ',' censur '],' sträng ',' max '=> 255]]; 

Låt oss nu använda dessa för att arbeta med och gå igenom några av de grundläggande validatorerna.

Obligatorisk Validator

RequiredValidator säkerställer att ett värde är närvarande. Du kan se den på plats ovan för rang, censur och inträffade.

Besök Sample Create-formuläret som genereras av Gii, t.ex. http: // localhost: 8888 / hello / prov / skapa. Yi's ActiveForm JavaScript-klient-validering kommer att presentera ett felmeddelande även om du flikar bort från ett av dessa fält.

Säker Validator

SafeValidator är inte en sann validator. Det möjliggör massiv tilldelning av en upplagd webbformulär för att inkludera ett attribut. t.ex. $ model-> attribut = $ _POST ['Kommentar']. Eller i den Gii skapade SampleController kan du se den här koden:

offentlig funktion actionCreate () $ model = new Sample (); om ($ model-> load (Yii :: $ app-> request-> post ()) && $ model-> spara ()) return $ this-> omdirigera (['view', 'id' => $ modell-> id]);  annars returnera $ this-> render ('create', ['model' => $ modell,]); 

Utan den säkra regeln i provmodellen (eller en annan regel) skulle det inträffade värdet inte tilldelas modellattributen. Detta minskar sannolikheten för en ytterligare angreppsvektor utan avsiktlig kod.

allmänna funktionsregler () return [[['occurred'], 'safe'],

Standardvärdesvaliderare

DefaultValueValidator är inte en sann validator. Den anger standardvärden för tomma fält.

Låt oss ändra regeln för inträffade för att ange ett standarddatumvärde med det aktuella datumet. Vi tar också bort den obligatoriska validatorn så att standardvalidatorn kan fylla värdet.

public function rules () return [[['godhet', 'rank'], 'heltal'], [['rank', 'censur'], 'krävs'], // Gii skapade detta // [[' inträffade "]," säkert "], [" inträffat "," standard "," värde "=> datum (" Ymd ")],

När vi skapar ett nytt prov och lämnar inträffade fält tomt, kan du se den resulterande vyn innehåller det aktuella datumet fyllt i av standardvärdesvalideraren.

filter

FilterValidator är inte heller en sann validator. Det utför en transformation på ett givet värde. Oftast kan du använda det här för att trimma blankutrymme utanför ändarna av en sträng. 

FilterValidators definieras med inline-funktionen återkopplingar som den här anpassade valideringsfunktionen:

// en inline validator definierad som en anonym funktion ['token', funktion ($ attribut, $ params) if (! ctype_alnum ($ this -> $ attribut)) $ this-> addError ($ attribut, 'The token måste innehålla bokstäver eller siffror. '); ],

Eftersom trim är en inbyggd PHP-funktion kan vi bara deklarera vår valideringsregel inline:

 [['tanke'], 'trim'], 

Om du skickar in ett formulär med föregående eller efterföljande utrymmen i tankefältet, tar FilterValidator bort dem.

Låt oss nu titta på några av de inbyggda typvalidatorerna.

Typ Validatorer

Typgodkännare säkerställer att användardata överensstämmer med specifika typer, ofta de som anges i ditt databasschema. Gii kommer att generera dessa automatiskt.

String- och nummervaliderare

StringValidator ser till att ett värde är en sträng. NumberValidator säkerställer att ett värde är numeriskt, t.ex. heltal eller float. 

Här är exempelregelregler:

 allmänna funktion regler () return [[['godhet', 'rank'], 'heltal'], [['tanke', 'censur'], 'sträng', 'max' => 255] // [ "rang", "censur"], "krävs"], 

Jag tar också tillfälligt bort den obligatoriska valideringen för att se hur sträng- och nummervalideringar fungerar oberoende.

Här är vad felaktighetsmeddelandena kommer att se ut:

Godhet så hög misslyckas eftersom det inte är ett tal, medan rank som 27 passerar. Censur är tom (NULL) och misslyckas med strängvalideringen.

Boolean Validator

Den BooleanValidator säkerställer att ett värde är sant eller felaktigt. Du kan definiera värdena för true och false. Standardinställningarna är heltal 0 eller 1. Denna validator kan vara mer användbar när fältet används med en nedrullningsväljare, t.ex. Ja Nej.

Så här definierade jag min regel för booleska:

 allmänna funktionsregler () return [[['goodness'], 'boolean'], [['rank'], 'heltal'], 

Här är det booleanska validatorfelmeddelandet:

Datum Validator

DateValidator säkerställer att värdet är ett korrekt formaterat datum som kan anpassas med ett formatattribut. Med Yii ActiveForm är det för närvarande en serversidorvalidering. Därför lade jag också tillbaka en obligatorisk regel för det förekommande fältet.

Här är mina regeldefinitioner med datumvalideraren för det förekommande fältet:

(funktionen) => 255], [['rank', 'censur', 'inträffat'], 'krävs'], ['inträffat', 'datum', 'format' => 'yyyy-M-d'] ['inträffat', 'standard', 'värde' => datum ("Ymd")], [['tänk'], 'trim'],]; 

Så här ser det ut när vi skickar in formuläret:

Vad kommer härnäst?

Titta på kommande handledningar i min programmering med Yii2-serien när jag fortsätter att dyka in i olika aspekter av ramen. I de följande två episoderna guidar jag dig genom de återstående validatorerna och visar dig hur man bygger avancerade tillägg till Yiis valideringsramar.

Du kanske också vill kolla in min Building Your Startup With PHP-serie, som använder Yii2s avancerade mall när jag bygger en verklig världsapplikation.

Jag välkomnar funktion och ämnesförfrågningar. Du kan lägga in dem i kommentarerna nedan, ping mig @ reifman på Twitter, eller maila mig på min Lookahead Consulting webbplats.

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

relaterade länkar

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