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. Denne opplæringen er vår andre del, ser på Yii2s validatorer. Validatorer forenkler koden som trengs for å validere innspill, dvs. verifisere samsvar eller manglende overholdelse av datainngang, vanligvis fra brukere via webskjemaer. Spesielt skal vi utforske noen av de innebygde spesialitetsvalideringene som er felles for webutvikling.
Her er en liste over de innebygde Yii-validatorene og koblingene til dokumentasjon som vi skal utforske:
Jeg skal veilede deg gjennom eksempler på hver av disse valideringene ved hjelp av Hello Application Codebase fra tidligere opplæringsprogrammer og et par fra vår Building Your Startup Series som også bruker Yii2. 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 eller email meg på Lookahead Consulting.
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 datafunksjonene gir samsvar 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.
Du vil kanskje gå tilbake til vår siste episode for å lese mer på Yii2s grunnleggende type valideringer.
Nå, la oss begynne å se på det neste settet av Yii2s innebygde validatorer.
La oss begynne med CaptchaValidator som kontrollerer at det er riktig svar på et CAPTCHA verifikasjonsfelt. CAPTCHAs bidrar til at et menneske fyller ut skjemaet, forhåpentligvis holder automatiserte skript fra å sende det inn.
Her er et eksempel på Yii Captcha i aksjon:
I vår Hello-kodebase har jeg forenklet vårt skjema for å bare inkludere feltene Thought and Captcha for nå. Her er en titt på modellkodens regeldefinisjoner:
klasseeksempel utvider \ yii \ db \ ActiveRecord public $ captcha; / ** * @inheritdoc * / offentlige funksjonsregler () return [[['thought'], 'string', 'max' => 255], [['thought'], 'trim'], [[' tanke '],' kreves '], [[captcha'], 'captcha'],];
The captcha er ikke en del av vårt databaseskjema. Det brukes bare til å verifisere skjemaet. Derfor har jeg lagt til et attributt til modellen for det, f.eks. offentlig $ captcha;
.
Her er visningskoden for skjemaet. Vi må inkludere Captcha-biblioteket øverst.
= $form->errorSummary ($ modell); ?> = $form->felt ($ modell, 'tanke') -> textInput (['maxlength' => 255])> = $form->feltet ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: klassenavn (), [// konfigurere ekstra widget egenskaper her])>= Html::submitButton($model->erNewRecord? 'Opprett': 'Oppdater', ['class' => $ model-> erNewRecord? 'btn btn-suksess': 'btn btn-primary'])?>
Slik ser Captcha-valideringen ut i handling:
Hvis du klikker på Captcha, vil Yii generere et nytt bilde.
Nå, la oss gå videre til CompareValidator. Denne validatoren sammenligner to verdier fra skjemaet eller en enkelt formverdien til en konstant, for eksempel x må være mindre enn 99.
For dette eksempelet vil jeg forsikre meg om at brukerinngangen for rang er større enn null, men mindre enn eller lik 100.
Først legger jeg inn feltet tilbake til vårt skjema for rangattributtet:
= $form->errorSummary ($ modell); ?> = $form->felt ($ modell, 'tanke') -> textInput (['maxlength' => 255])> = $form->felt ($ modell, 'rang') -> textInput ()?> = $form->feltet ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: klassenavn (), [// konfigurere ekstra widget egenskaper her])>
Deretter legger jeg til to sammenligne valideringsregler til vår modell:
offentlige funksjon regler () return [[['tanke'], 'streng', 'max' => 255], [['tanke'], 'trim'], [['tanke'], 'nødvendig'] , ['captcha'], 'captcha'], [['rang'], 'heltall'], ['rang', 'sammenligne', 'compareValue' => 0, 'operator' => '>'] , ['rang', 'sammenligne', 'compareValue' => 100, 'operator' => '<='], ];
Du kan se en fullstendig liste over tilgjengelige sammenligningsoperatører her.
Slik ser vårt skjema ut når brukeren sender et ugyldig attributt:
Hvis vi vil gi de spesifikke begrensningsreglene i en feilmelding, tillater Yii Validators deg å tilpasse feilen som er vist for brukeren, slik:
Implementering av dette er ganske enkelt med tillegg av meldingsattributtet:
offentlige funksjon regler () return [[['tanke'], 'streng', 'max' => 255], [['tanke'], 'trim'], [['tanke'], 'nødvendig'] , ['captcha'], 'captcha'], [['rang'], 'heltall'], ['rang', 'sammenligne', 'compareValue' => 0, 'operator' => '>' 'message' => Yii :: t ('app', 'Rang må være mellom 0 og 100 inkludert.')], ['rang', 'sammenligne', 'compareValue' => 100, 'operator' => '<=','message'=>Yii :: t ('app', 'Rangeringen må være mellom 0 og 100 inkludert.')],];
For noen av disse neste valideringstestene, vil jeg be deg om å legge til noen felt i databasen.
I \ vandringer \ m150219_235923_create_sample_table.php
, Vi legger til noen nye felt for å teste det neste settet av validatorer: e-post, URL, filnavn osv.
$ this-> createTable ('sample', ['id' => Skjema :: TYPE_PK, 'thought' => Skjema :: TYPE_STRING. 'IKKE NULL DEFAULT ""', 'godhet' => Skjema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'rang' => Skjema :: TYPE_INTEGER. 'IKKE NULL', 'censur' => Skjema :: TYPE_STRING. 'IKKE NULL', 'skjedd' => Skjema :: TYPE_DATE . 'NOT NULL', 'email' => Skjema :: TYPE_STRING. 'IKKE NULL DEFAULT ""', 'url' => Skjema :: TYPE_STRING. 'IKKE NULL DEFAULT ""', 'filnavn' => Skjema :: TYPE_STRING. 'NOT NULL', 'avatar' => Skjema :: TYPE_STRING. 'NOT NULL',], $ tableOptions);
Kjør deretter overføringen for å slippe bordet og deretter opp:
Admins-MBP: hei Jeff $ ./yii migrere / ned 1 Yii Migreringsverktøy (basert på Yii v2.0.2) Totalt 1 migrering som skal returneres: m150219_235923_create_sample_table Gjenopprett ovennevnte migrasjon? (ja | nei) nei: ja *** tilbake m150219_235923_create_sample_table> drop table % sample ... ferdig (tid: 0.002s) *** tilbakestilt m150219_235923_create_sample_table (tid: 0.005s) Migrert ned med hell. Admins-MBP: hei Jeff $ ./yii migrere / opp 1 Yii Migreringsverktøy (basert på Yii v2.0.2) Totalt 1 ny migrasjon som skal brukes: m150219_235923_create_sample_table Bruk overføringen ovenfor? (ja | nei) nei: ja *** gjelder m150219_235923_create_sample_table> opprett tabell % sample ... ferdig (tid: 0.007s) *** brukt m150219_235923_create_sample_table (tid: 0.010s) Migrert opp.
Vi er nå klar til å teste e-postadressene og URL-validatorene.
EmailValidator sikrer at en verdi er en gyldig e-postadresse, og UrlValidator sikrer at en verdi er i URL-format, f.eks. http://yourdomain.com.
Det er ganske enkelt å lage regler for våre nye e-postadresser og URL-felter:
offentlige funksjon regler () return [[['' tanke '],' streng ',' max '=> 255], [[' e-post '],' epost '], [[' url '],' url '],
Her er visningskoden for skjemaet. Legg merke til hvordan jeg bruker egendefinerte etiketter for å forbedre formens brukervennlighet:
= $form->errorSummary ($ modell); ?> = $form->felt ($ modell, 'tanke') -> textInput (['maxlength' => 255])> = $form->feltet ($ model, 'email') -> textInput () -> label (Yii :: t ('app', 'Din e-postadresse'))>> = $form->feltet ($ model, 'url') -> textInput () -> etikett (Yii :: t ('app', 'Din nettside'))>Her er validatorene i aktion:
Disse er åpenbart svært nyttige for webapplikasjoner.
Den eksisterende valideringsenheten
ExistValidator er super nyttig i visse scenarier. Det kan sikre at en verdi eksisterer i en annen tabell. Og det kan brukes på flere måter - her er noen eksempler gitt i dokumentasjonen:
// a1 må eksistere ['a1', 'eksisterer'] // a1 må eksistere, men verdien sin vil bruke a2 for å sjekke eksistensen ['a1', 'exist', 'targetAttribute' => 'a2' ] // a1 og a2 må eksistere sammen, og begge vil motta feilmelding [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1', 'a2']] // a1 og a2 må eksistere sammen, vil bare a1 få feilmelding ['a1', 'exist', 'targetAttribute' => ['a1', 'a2']] // a1 må eksistere ved å kontrollere eksistensen av begge a2 og a3 (bruker a1 verdi) ['a1', 'eksisterer', 'targetAttribute' => ['a2', 'a1' => 'a3']]Yii dokumentasjonen fremhever at Exist kan brukes til å "verifisere at en fremmed nøkkel inneholder en verdi som kan finnes i utenlandstabellen."
For vårt eksempel skal jeg opprette en regel som kontrollerer at e-postadressen i skjemaet allerede finnes i vårt registrerte brukertabell. For å gjøre dette bruker vi targetClass som forteller Yii hvilken klasse (eller modell tabell) for å slå opp brukerens e-postadresse i for validering.
Her er regelen definisjonen-notat inkluderingen av vår brukermodell øverst:
255], [['email'], 'email'], [['email'], 'exist', 'targetClass' => '\ app \ models \ Bruker', 'message' => Yii :: t 'app', 'Beklager, den personen har ikke registrert seg ennå')], [['url'], 'url'],Det instruerer Yii å spørre brukertabellen for å sikre at den angitte e-postadressen samsvarer med en tidligere registrert bruker.
Her ser det ut som om det virker
Du kan lære mer om eksisterende validering og dens permutasjoner her.
Fil- og bildegodkjenningene
Deretter skal jeg vise eksempler på FileValidator, som sikrer eksistens, MIME-type og størrelse på en opplastet fil, og ImageValidator, som validerer bildet og dets egenskaper.
For å utforske fil- og bildevalidatorene, la oss se på et eksempel fra Build Your Startup With PHP-serien: Brukerinnstillinger, Profilbilder og Kontaktdetaljer. I den episoden i UserSettings-modellen tillater vi brukere å laste opp en fil for profilbildet sitt.
Bildetributtet godtar den opplastede filen:
offentlige funksjon regler () return [[['user_id',], 'required'], [['user_id',], 'unique'], [['image'], 'safe'], [[' '', 'fil', 'extensions' => 'jpg, gif, png'], [['' bilde '],' fil ',' maxSize '=>' 100000 '], [' bilde ' , 'extensions' => 'png, jpg, gif', 'minWidth' => 100, 'maxWidth' => 400, 'minHeight' => 100, 'maxHeight' => 400,],FileValidators sikrer at bildet slutter i en riktig bildeutvidelse og er mindre enn 100 000 byte.
ImageValidator verifiserer også utvidelsestypen, samt bredden og høyden for bildet.
Her er et eksempel på feil som oppstår ved å laste opp et bilde hvis dimensjoner er større enn 400 x 400 piksler:
Det er min assistent ovenfor som pleide å kopiere mine opplæringsprogrammer.
Utvalget i validator
Det er også RangeValidator som sikrer at en verdi er innenfor en liste over tillatte oppføringer.
For vårt eksempel, la oss legge til feltet for censur tilbake i skjemaet:
= $form->errorSummary ($ modell); ?> = $form->felt ($ modell, 'tanke') -> textInput (['maxlength' => 255])> = $form->feltet ($ model, 'email') -> textInput () -> label (Yii :: t ('app', 'Din e-postadresse'))>> = $form->feltet ($ model, 'url') -> textInput () -> etikett (Yii :: t ('app', 'Din nettside'))> = $form->felt ($ modell, 'sensur') -> textInput ()?> = $form->felt ($ modell, 'rang') -> textInput ()?> = $form->feltet ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: klassenavn (), [// konfigurere ekstra widget egenskaper her])>Deretter legger vi til en RangeValidator for å matche svaret på a ja eller Nei streng:
offentlige funksjon regler () return [[['tanke'], 'streng', 'max' => 255], ['tanke', 'match', 'mønster' => '/ ^ [az] Za-z,; \ "\\ s] + [!?.] $ / I ',' message '=> Yii :: t (' app ',' Dine tanker skal danne en fullstendig setning av alfabetiske tegn. ') ], [['email'], 'email'], [['email'], 'exist', 'targetClass' => '\ app \ models \ Bruker', 'message' => Yii :: t app ',' Beklager, den personen har ikke registrert seg ennå ')], [[' url '],' url '], [' censur ',' i ',' range '=> [' ja ' nei ',' Ja ',' Nei '],' melding '=> Yii :: t (' app ',' Sensorene krever et ja eller nei svar. ')],Her er et eksempel på RangeValidator i aksjon:
Regeluttrykksregulatoren for vanlig uttrykk
La oss se på RegularExpressionValidator, som utfører validering mot en tilstand som er definert av et regulært uttrykk.
I vårt eksempel bruker jeg følgende regex for å matche komplette setninger med alfabetiske tegn. Dette betyr at de må ende med enten (!,? Eller.) Og har ingen numeriske tegn.
offentlige funksjon regler () return [[['tanke'], 'streng', 'max' => 255], ['tanke', 'match', 'mønster' => '/ ^ [az] Za-z,; \ "\\ s] + [!?.] $ / I ',' message '=> Yii :: t (' app ',' Dine tanker skal danne en fullstendig setning av alfabetiske tegn. ') ],Her er et eksempel på brukerinngang som mislykkes testen på grunn av tallene og mangelen på et etterfølgende tegnsettingstegn:
Her er en gyldig setning:
Du kan også være interessert i åtte ordinære uttrykk du bør vite (Tuts +) som en referanse for vanlige regex-mønstre.
Den unike validatoren
Til slutt, la oss se gjennom UniqueValidator, som sikrer at en verdi er unik i et bord, for eksempel en e-postadresse eller en slug.
Jeg har gjennomgått SluggableBehavior tidligere i denne serien, som tilbyr sin egen innebygde unike støtte. Men la oss se på et par flere eksempler fra Build Your Startup With PHP-serien.
I kodebase for møteplanlegger (fra de nyere opplæringsepisoder) i stedmodellen (
\ frontend \ modeller \ Place.php
), bruker vi den unike validatoren på flere måter: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']],];Først bruker vi den unike regelen med slug for å øke SluggableBehavior, som er overflødig; men du kan se valideringsformatet.
For det andre sjekker vi at resultatene av Google Places Autofullfør søkeboks resulterer i det skjulte feltet for
google_place_id
være unik fordi den ennå ikke finnes i Steder-tabellen ennå. Vi forebygger i hovedsak dupliserte Google Place-IDer.Den betydelige delen av dette er at Yii2s unike validator tillater oss å håndheve unikthet på det synlige feltet (
søkefelt
) Mens du validerer den i den sekundære kolonnen returnert via AJAX fra Google (google_place_id
).For det tredje sikrer vi det
Navn
ogfull adresse
er unike sammen. Med andre ord er dupliserte stednavn ok. Det kan være en bazillion Starbucks. Vi vil imidlertid ikke at noen kommer inn på samme Starbucks sted to ganger.Merk: Starbucks kaffe er ikke et effektivt stimulansmiddel for programvareutviklere. Jeg oppfordrer deg til hyppige uavhengige kaffebarer.
Her er et eksempel på dette i aksjon:
Hva blir det neste?
Jeg håper at du er enig i hvor enkle og nyttige Yii2-validatorer er for webutvikling. Jeg kan bare ikke forestille meg å komme tilbake til vanilje PHP-utvikling uten hjelp av et rammeverk.
Se etter kommende opplæringsprogrammer i min programmering med Yii2-serien når jeg fortsetter å dykke inn i ulike aspekter av rammen. I neste episode skal jeg gjennomgå Yii2s avanserte valideringsfunksjoner som:
- Betinget validering for å utføre en valideringsregel bare hvis en bestemt hendelse er sann
- 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.
- Valideringshendelser for å overstyre validering eller utføre spesifikk funksjonalitet før og / eller etter validering
- Definere scenarier for å selektivt anvende regler for visse situasjoner
- Ad hoc-validering for å bruke valideringsregler uavhengig av skjemainnlevering
Jeg aksepterer funksjon og emneforespørsler. Du kan legge inn dem i kommentarene nedenfor, nå ut til meg @ reifman på Twitter, eller send meg en e-mail til Lookahead Consulting.
Hvis du vil vite når neste Yii2 opplæring kommer, kan du også sjekke min Tuts + instruktørside. Det inneholder alltid lenker til artiklene mine umiddelbart etter at de er publisert.
Relaterte linker
- Yii2 Guide til validering av brukerinngang
- Yii2 Guide til Core Validators
- Yii2 Validators (Dokumentasjon)
- Yii2 Developer Exchange, mitt eget Yii2 ressursområde