Hvis du spør, "hva er Yii?" sjekk ut min tidligere opplæring: Introduksjon til Yii Framework, som vurderer fordelene med Yii og inneholder en oversikt over hva som er nytt i Yii 2.0, utgitt i oktober 2014.
I denne programmeringen med Yii2-serien, er jeg veiledende lesere i bruk av den nylig oppgraderte Yii2 Framework for PHP. I denne opplæringen skal jeg introdusere deg til Yii2s validatorer. Validatorer forenkler koden som trengs for å validere innspill, dvs. verifisere samsvar eller manglende overholdelse av datainngang, vanligvis fra brukere via webskjemaer.
For disse eksemplene fortsetter vi å utnytte Hello-programkodebasen vi har brukt i tidligere opplæringsprogrammer. Bruk GitHub-koblingene på denne siden for å få koden.
Bare en påminnelse, jeg deltar i kommentar tråder nedenfor. Jeg er spesielt interessert hvis du har flere ideer eller ønsker å foreslå emner for fremtidige opplæringsprogrammer. Du kan også nå meg @ reifman på Twitter.
Hvis du er en webutvikler, vet du sannsynligvis at brukerinngang ikke kan stole på. For eksempel kan brukere bruke SQL-injeksjonsteknikker for å prøve å kjøre spørringer som endrer eller avslører passord. Noen en gang leveraged SQL-injeksjon mot åpen installasjon PHPList-installasjonen og klarte å oppdage et av passordene mine (PHPList lagret disse i vanlig tekst). Oftere vil du bare sørge for at dataene som brukerne gir, samsvarer med typene, skjemaene og områdene av søknaden din.
Building validators i PHP for hånd tar tid. Yii Framework gir massevis av baseline validering funksjoner, så det er ikke nødvendig å bygge dem fra bunnen av. Men hvis du trenger noen tilpassede tillegg, er det også greit.
Validasjoner er enda en grunn til at jeg tror det alltid gir mening å bygge applikasjoner på et webramme som Yii i stedet for vanilje PHP.
I tidligere episoder har vi også snakket mye om Yii kode generator, Gii. En av fordelene med Gii er at den vil skrive passende valideringsregler for modellene dine basert på definisjonene av SQL-typen i skjemaet. Dette er en stor tidsbesparende.
Her er en liste over de innebygde Yii-validatorene og koblingene til dokumentasjonen:
Slik beskriver Yii strømmen av validering. Vanligvis kan du bruke standard scenariet og ikke trenger å bygge din egen. Du må generelt stole på Gii for å generere regler eller skrive din egen.
Når validere()
Metoden kalles, det går gjennom følgende trinn for å utføre validering:
I henhold til ovennevnte valideringstrinn blir en attributt validert hvis og bare hvis det er et aktivt attributt deklarert i scenarier ()
og er knyttet til ett eller flere aktive regler som er deklarert i regler ()
.
Her er hva et sett med modellvalideringsregler kan se ut. Jeg har tatt disse fra møteplanleggerprogrammet Stedmodell:
offentlige funksjon regler () return [[['navn', 'slug'], 'required'], [['place_type', 'status', 'created_by', 'created_at', 'updated_at'], 'integer' ], [[navn ',' google_place_id ',' slug ',' nettsted ',' full_address ',' nærhet '],' streng ',' max '=> 255], [[' nettsted '] '], [[' slug '],' unikt '], [[' searchbox '],' unikt ',' targetAttribute '=>' google_place_id '], [[' navn ',' fulladdress '],' unikt ' , 'targetAttribute' => ['navn', 'full_address']],];
Når vi implementerer våre egne valideringseksempler nærmere nedenfor, lærer du hva hver av definisjonene ovenfor representerer.
Det finnes et par måter å få tilgang til feilene som returneres ved validering.
Her er et eksempel på å få en rekke feil i kontrolleren:
$ model = new \ app \ models \ ContactForm; // populere modellattributter med brukerinnganger $ model-> attributes = \ Yii :: $ app-> request-> post ('ContactForm'); if ($ model-> validate ()) // alle innganger er gyldige annet // validering mislyktes: $ feil er en matrise som inneholder feilmeldinger $ errors = $ model-> errors;
Og her er et eksempel på å utnytte Yii's errorSummary-funksjon i ActiveForms:
= $form->errorSummary ($ modell); ?>Slik ser det ut:
Avansert validering
I senere episoder vil jeg også gi eksempler på å benytte avanserte valideringsfunksjoner:
- Definere scenarier for å selektivt anvende regler for visse situasjoner
- Definere egendefinerte feilmeldinger
- Valideringshendelser for å overstyre validering eller utføre spesifikk funksjonalitet før og / eller etter validering
- Betinget validering for å utføre en valideringsregel bare hvis en bestemt hendelse er sann
- Ad hoc-validering for å bruke valideringsregler uavhengig av skjemainnlevering
- Egendefinerte validatorer for å skape viktige valideringer utover hva Yii tilbyr ut av boksen
- Validering av klientsiden for å gjøre bruk av Yi's innebygde ActiveForm JavaScript-validering uten at det krever en sideoppdatering
- AJAX-validering for å implementere server-side AJAX-valideringer for å utvide Yi's kundeside-JavaScript-valideringskapasitet
For nå, la oss begynne å gå gjennom eksempler på ulike typer innebygde validatorer.
Basic Field Validators
La oss se på noen av de grunnleggende feltvalideringsverktøyene som er nyttige for hverdagens formimplementering.
Forbereder en modell ved hjelp av migrasjoner og Gii
Som vi har gjort i tidlige episoder av denne serien, skal jeg lage en migrasjon:
./ yii migrere / opprett create_sample_tableJeg lager en eksempelmodell for å lage noen eksempelskjemaer og valideringer ved hjelp av Gii. Her er overføringskoden:
db-> drivernavn === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'; $ this-> createTable ('sample', ['id' => Skjema :: TYPE_PK, 'thought' => Skjema :: TYPE_STRING. 'IKKE NULL DEFAULT ""', 'godhet' => Schema :: TYPE_SMALLINT. 'IKKE NULL DEFAULT 0', 'rang' => Skjema :: TYPE_INTEGER. 'IKKE NULL', 'censur' => Skjema :: TYPE_STRING. 'IKKE NULL', 'skjedd' => Skjema :: TYPE_DATE. 'NOT NULL',], $ tableOptions); offentlig funksjon ned () $ this-> dropTable ('sample');Deretter kjører vi overføringen:
./ Yii migrere / opp Yii Migreringsverktøy (basert på Yii v2.0.2) Totalt 1 ny migrering som skal brukes: m150219_235923_create_sample_table Bruk overføringen ovenfor? (ja | nei) [nei]: ja *** bruker m150219_235923_create_sample_table> opprett tabell % sample ... ferdig (tid: 0.009s) *** brukt m150219_235923_create_sample_table (tid: 0.015s) Migrert opp.Deretter bruker vi Yii kode generator for å bygge en modell:
Og så CRUD-filer:
Gii genererer disse utvalgsreguleringsreglene:
klasseeksempel utvider \ yii \ db \ ActiveRecord public function rules () return [[['godhet', 'rang'], 'heltall'], [['rang', 'sensur', 'skjedd'] ' kreves '], [[' occurred '],' safe '], [[' tanke ',' sensur '],' streng ',' max '=> 255]];La oss nå bruke disse til å jobbe med og gå gjennom noen av de grunnleggende validatorene.
Nødvendig validator
RequiredValidator sikrer at en verdi er til stede. Du kan se det på plass over for rang, censur og skjedd.
Besøk Sample Create-skjemaet generert av Gii, f.eks. http: // localhost: 8888 / hei / sample / skape. Yii's ActiveForm JavaScript-klient-validering vil presentere en feilmelding, selv når du går bort fra et av disse feltene.
Sikker Validator
SafeValidator er ikke en ekte validator. Det tillater massiv tildeling av et utgitt webskjema for å inkludere et attributt. f.eks $ model-> attributter = $ _POST ['Kommentar']. Eller, i Gii opprettet SampleController, kan du se denne koden:
offentlig funksjon actionCreate () $ model = new Sample (); hvis ($ modell-> last (Yii :: $ app-> forespørsel-> post ()) && $ modell-> lagre ()) return $ this-> omdirigere (['view', 'id' => $ modell> id]); ellers return $ this-> render ('create', ['model' => $ modell,]);Uten den sikre regelen i Eksempelmodellen (eller en annen regel), ville den oppførte verdien ikke bli tildelt modellattributtene. Dette reduserer sannsynligheten for en ekstra angrep vektor uten bevisst kode.
offentlige funksjon regler () return [[['skjedd'], 'safe'],Standardverdier Validator
DefaultValueValidator er ikke en sann validator. Den angir standardverdier for tomme felt.
La oss endre regelen for
inntraff
for å angi en standard datoverdi ved hjelp av gjeldende dato. Vi fjerner også den nødvendige validatoren for å tillate at standard validatoren fyller verdien.offentlige funksjonsregler () return [[['godhet', 'rang'], 'heltall'], [['rang', 'censur'], 'nødvendig'], // Gii opprettet dette // [[' skjedde '],' sikker '], [' skjedd ',' standard ',' verdi '=> dato ("Ymd")],Når vi lager en ny prøve og forlater
inntraff
feltet tomt, kan du se den resulterende visningen inkluderer gjeldende dato som er fylt ut av standardverdiervalidatoren.filtre
FilterValidatoren er heller ikke en sann validator. Den utfører en transformasjon på en gitt verdi. Vanligvis kan du bruke dette til å trimme hvite plass utenfor enden av en streng.
FilterValidators er definert med inlinefunksjon tilbakeringinger som denne tilpassede valideringsfunksjonen:
// en inline validator definert som en anonym funksjon ['token', funksjon ($ attributt, $ params) if (! ctype_alnum ($ this -> $ attributt)) $ this-> addError ($ attribute, 'The token må inneholde bokstaver eller sifre. '); ],Siden trim er en innfødt PHP-funksjon, kan vi bare erklære vår valideringsregel inline:
[['tanke'], 'trim'],Hvis du sender inn et skjema med forhåndsdefinerte eller etterfølgende mellomrom på tankefeltet, vil FilterValidator fjerne dem.
La oss nå se på noen av de innebygde typegodkjøpene.
Type Validators
Typevalidatorer sikrer at brukerdata stemmer overens med bestemte typer, ofte de som er angitt i databaseskjemaet. Gii vil generere disse automatisk.
String- og nummervalidator
StringValidator sikrer at en verdi er en streng. NumberValidator sikrer at en verdi er numerisk, f.eks. heltall eller flyt.
Her er utvalgsregeldefinisjoner:
offentlige funksjon regler () return [[['godhet', 'rang'], 'heltall'], [['tanke', 'sensur'], 'streng', 'max' => 255] // [ 'rang', 'sensur'], 'nødvendig'],Jeg fjerner også den nødvendige valideringen midlertidig for å se hvordan streng- og nummervalideringer fungerer uavhengig.
Her er hva valideringsfeilmeldingene vil se ut:
Godhet så høy feiler fordi det ikke er et tall, mens rang som 27 går. Censur er tom (NULL) og mislykkes streng validering.
boolean Validator
Den BooleanValidator sikrer at en verdi er sann eller falsk. Du kan definere verdiene for ekte og falsk. Standardene er heltall 0 eller 1. Denne validatoren kan være mer nyttig når feltet brukes med en rullegardinvelger, f.eks. Ja Nei.
Slik definerte jeg min regel for boolsk:
offentlige funksjon regler () return [[['godhet'], 'boolean'], [['rang'], 'heltall'],Her er den booleanske validator feilmeldingen:
Dato Validator
DateValidator sikrer at verdien er en riktig formatert dato som kan tilpasses med et formatattributt. Med Yii ActiveForm er dette for øyeblikket en server side validering. Derfor lagde jeg også tilbake en nødvendig regel for forekomsten.
Her er mine regeldefinisjoner med Date validator for Occurred-feltet:
offentlige funksjonsregler () return [[['goodness'], 'boolean'], [['rang'], 'heltall'], [['tanke', 'sensur'], 'streng' => 255], [['rang', 'sensur', 'skjedd'], 'nødvendig'], ['skjedd', 'dato', 'format' => 'yyyy-M-d'] ['skjedd', 'standard', 'verdi' => dato ("Ymd")], [['tanke'], 'trim'],];Slik ser det ut når vi sender inn skjemaet:
Hva blir det neste?
Se etter kommende opplæringsprogrammer i min programmering med Yii2-serien når jeg fortsetter å dykke inn i ulike aspekter av rammen. I de neste to episodene vil jeg veilede deg gjennom de gjenværende validatorene og vise deg hvordan du bygger avanserte utvidelser til Yii's valideringsramme.
Du vil kanskje også sjekke ut Bygg opp din oppstart med PHP-serien, som bruker Yii2s avanserte mal, da jeg bygger en ekte verdensapplikasjon.
Jeg aksepterer funksjon og emneforespørsler. Du kan legge inn dem i kommentarene nedenfor, ping meg @ reifman på Twitter, eller send meg en e-post på mitt Lookahead Consulting nettsted.
Hvis du vil vite når neste Yii2 opplæring kommer, kan du sjekke min Tuts + instruktørside. Det inneholder alltid alle mine artikler umiddelbart etter at de er publisert.
Relaterte linker
- Yii2 Guide til validering av brukerinngang
- Yii2 Validators (Dokumentasjon)
- Yii2 Developer Exchange, min Yii2 ressurs side