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.
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.
Hier is een lijst van de ingebouwde Yii-validators en links naar documentatie:
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:
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()
.
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.
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:
= $form->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 makenIk 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