Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an: Einführung in das Yii-Framework, Hier werden die Vorteile von Yii beschrieben und ein Überblick über die Neuerungen in Yii 2.0 (Oktober 2014) gegeben.
In dieser Programmierserie mit Yii2 leite ich die Leser beim Einsatz des neu aktualisierten Yii2-Frameworks für PHP. Dieses Tutorial ist unser zweiter Teil und betrachtet die Validatoren von Yii2. Validierer vereinfachen den Code, der zur Validierung der Eingabe erforderlich ist, d. H. Die Konformität oder Nichtübereinstimmung der Dateneingabe, typischerweise von Benutzern über Webformulare. Insbesondere werden wir einige der integrierten Spezialvalidierungen untersuchen, die in der Webentwicklung üblich sind.
Hier finden Sie eine Liste der integrierten Yii-Validatoren und Links zu der Dokumentation, die wir untersuchen werden:
Ich werde Sie durch Beispiele für jede dieser Validierungen führen, wobei die Hello-Anwendungscodebase aus früheren Tutorials und ein paar aus unserer Building Your Startup Series verwendet wird, die ebenfalls Yii2 verwendet. Verwenden Sie die GitHub-Links auf dieser Seite, um den Code zu erhalten.
Nur zur Erinnerung, ich beteilige mich an den Kommentarthreads unten. Ich bin besonders interessiert, wenn Sie weitere Ideen haben oder Themen für zukünftige Tutorials vorschlagen möchten. Sie können mich auch @reifman auf Twitter erreichen oder mich bei Lookahead Consulting per E-Mail benachrichtigen.
Wenn Sie ein Webentwickler sind, wissen Sie wahrscheinlich, dass Benutzereingaben nicht vertrauenswürdig sind. Zum Beispiel können Benutzer SQL-Injektionstechniken verwenden, um Abfragen auszuführen, die Kennwörter ändern oder freigeben. Jemand hat einmal die SQL-Injection gegen meine Open Source PHPList-Installation eingesetzt und konnte eines meiner Passwörter erkennen (PHPList speichert diese in Klartext).. Im Allgemeinen möchten Sie lediglich sicherstellen, dass die von Benutzern bereitgestellten Daten den Typen, Formularen und Bereichen Ihrer Anwendung entsprechen.
Das Erstellen von Validatoren in PHP von Hand erfordert Zeit. Das Yii Framework bietet eine Vielzahl von Grundüberprüfungsfunktionen, so dass sie nicht von Grund auf neu erstellt werden müssen. Wenn Sie jedoch einige benutzerdefinierte Erweiterungen benötigen, ist das ebenfalls unkompliziert.
Validierungen sind ein weiterer Grund, warum es meiner Meinung nach immer sinnvoll ist, Anwendungen auf einem Webframework wie Yii zu erstellen, statt auf Vanilla PHP.
In früheren Episoden haben wir auch viel über Yiis Code-Generator Gii gesprochen. Einer der Vorteile von Gii ist, dass basierend auf den SQL-Typdefinitionen im Schema die entsprechenden Validierungsregeln für Ihre Modelle geschrieben werden. Dies ist eine große Zeitersparnis.
Vielleicht möchten Sie zu unserer letzten Episode zurückkehren, um mehr über die grundlegenden Typvalidierungen von Yii2 zu erfahren.
Beginnen wir nun mit dem nächsten Satz der eingebauten Validatoren von Yii2.
Beginnen wir mit CaptchaValidator, der prüft, ob eine korrekte Antwort auf ein CAPTCHA-Überprüfungsfeld vorliegt. CAPTCHAs helfen sicherzustellen, dass ein Mensch das Formular ausfüllt, und hoffentlich verhindern, dass automatisierte Skripte es senden.
Hier ist ein Beispiel für das Yii Captcha in Aktion:
In unserer Hello-Codebasis habe ich unser Beispielformular vereinfacht, um nur die Felder "Gedanken" und "Captcha" einzubeziehen. Hier sehen Sie die Regeldefinitionen des Modellcodes:
class Sample erweitert \ yii \ db \ ActiveRecord public $ captcha; / ** * @inheritdoc * / public function rules () return [[['' gedacht '],' string ',' max '=> 255], [[' 'think'], 'trim'], [[' Gedanken '],' erforderlich '], [[' captcha '],' captcha '],];
Das Captcha ist nicht Teil unseres Datenbankschemas, es wird nur zur Bestätigung des Formulars verwendet. Daher habe ich dem Modell ein Attribut dafür hinzugefügt, z. öffentliches $ captcha;
.
Hier ist der Ansichtscode für das Formular. Wir müssen die Captcha-Bibliothek oben einfügen.
= $form->errorSummary ($ model); ?> = $form->Feld ($ model, 'thought') -> textInput (['maxlength' => 255])?> = $form->Feld ($ model, 'captcha') -> Widget (\ yii \ captcha \ Captcha :: classname (), [// zusätzliche Eigenschaften des Widgets hier konfigurieren])?>= Html::submitButton($model->isNewRecord? 'Create': 'Update', ['class' => $ model-> isNewRecord? 'btn btn-success': 'btn btn-primary'])?>
So sieht die Captcha-Validierung in Aktion aus:
Wenn Sie auf das Captcha klicken, generiert Yii ein neues Bild.
Nun geht es weiter zum CompareValidator. Dieser Prüfer vergleicht zwei Werte aus dem Formular oder einen einzelnen Formularwert mit einer Konstante, z. B. muss x kleiner als 99 sein.
In diesem Beispiel möchte ich sicherstellen, dass die Benutzereingabe für den Rang größer als null ist, jedoch kleiner oder gleich 100 ist.
Zuerst füge ich das Eingabefeld wieder für unser Rangattribut hinzu:
= $form->errorSummary ($ model); ?> = $form->Feld ($ model, 'thought') -> textInput (['maxlength' => 255])?> = $form->Feld ($ model, 'rank') -> textInput ()?> = $form->Feld ($ model, 'captcha') -> Widget (\ yii \ captcha \ Captcha :: classname (), [// zusätzliche Eigenschaften des Widgets hier konfigurieren])?>
Dann füge ich unserem Modell zwei Vergleichsregeln hinzu:
public function rules () return [[['[gedanke "],' string ',' max '=> 255], [[' 'dachte'], 'trim'], [['' dachte '],' required '] , [['captcha'], 'captcha'], [['' rank '],' integer '], [' rank ',' compare '', 'compareValue' => 0, 'operator' => '>'] , ['rank', 'compare', 'compareValue' => 100, 'operator' => '<='], ];
Eine vollständige Liste der verfügbaren Vergleichsoperatoren finden Sie hier.
So sieht unser Formular aus, wenn der Benutzer ein ungültiges Attribut übermittelt:
Wenn Sie die spezifischen Integritätsregeln in einer Fehlermeldung angeben möchten, können Sie mit Yii Validators den für den Benutzer angezeigten Fehler wie folgt anpassen:
Dies zu implementieren ist mit dem Message-Attribut recht einfach:
public function rules () return [[['[gedanke "],' string ',' max '=> 255], [[' 'dachte'], 'trim'], [['' dachte '],' required '] , [['captcha'], 'captcha'], [['' rank '],' integer '], [' rank ',' compare '', 'compareValue' => 0, 'operator' => '>', 'message' => Yii :: t ('app', 'Rang muss zwischen 0 und 100 einschließlich liegen.')], ['rank', 'compare', 'compareValue' => 100, 'operator' => '<=','message'=>Yii :: t ('app', 'Rang muss zwischen 0 und 100 sein.')],];
Für einige dieser nächsten Validierungstests möchte ich Sie bitten, der Datenbank einige Felder hinzuzufügen.
Im \ migrations \ m150219_235923_create_sample_table.php
, Wir werden einige neue Felder hinzufügen, um die nächsten Validatoren zu testen: E-Mail, URL, Dateiname usw.
$ this-> createTable ('% sample', ['id' => Schema :: TYPE_PK, 'thought' => Schema :: TYPE_STRING. 'NOT NULL DEFAULT ""', 'goodness' => Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'rank' => Schema :: TYPE_INTEGER. 'NOT NULL', 'Zensur' => Schema :: TYPE_STRING. 'NOT NULL', 'aufgetreten' => Schema :: TYPE_DATE 'NOT NULL', 'email' => Schema :: TYPE_STRING. 'NOT NULL DEFAULT "",' url '=> Schema :: TYPE_STRING.' NOT NULL DEFAULT "" "," Dateiname "=> Schema :: TYPE_STRING. 'NOT NULL', 'avatar' => Schema :: TYPE_STRING. 'NOT NULL',], $ tableOptions);
Führen Sie dann die Migration aus, um die Tabelle zu löschen, und führen Sie dann eine Aufwärtsbewegung durch:
Admins-MBP: Hallo Jeff $ ./yii migrieren / down 1 Yii Migration Tool (basierend auf Yii v2.0.2) Gesamtzahl der zu wiederherstellenden Migration: m150219_235923_create_sample_table Die obige Migration rückgängig machen? (Ja | Nein) [Nein]: Ja *** Rückgängigmachen von m150219_235923_create_sample_table> Drop-Tabelle % sample… done (Zeit: 0,002s) *** Zurückgesetzt m150219_235923_create_sample_table (Zeit: 0,005s) Erfolgreich migriert. Admins-MBP: Hallo Jeff $ ./yii migrieren / up 1 Yii Migration Tool (basierend auf Yii v2.0.2) Insgesamt 1 neue Migration, die angewendet werden soll: m150219_235923_create_sample_table Anwenden der obigen Migration? (Ja | Nein) [Nein]: Ja *** Anwenden von m150219_235923_create_sample_table> create table % sample… done (Zeit: 0,007s) *** angewendet m150219_235923_create_sample_table (Zeit: 0.010s) Wurde erfolgreich migriert.
Wir können jetzt die E-Mail- und URL-Validatoren testen.
Der EmailValidator stellt sicher, dass ein Wert eine gültige E-Mail-Adresse ist, und der UrlValidator stellt sicher, dass ein Wert im URL-Format vorliegt, z. http://ihredomain.com.
Es ist ziemlich einfach, Regeln für unsere neuen E-Mail- und URL-Felder zu erstellen:
öffentliche Funktionsregeln () return [[['[gedanken "],' string ',' max '=> 255], [[' email '],' email '], [[' 'url'], 'url'],
Hier ist der Ansichtscode für das Formular. Beachten Sie, wie ich benutzerdefinierte Etiketten zur Verbesserung der Formularverwendbarkeit verwende:
= $form->errorSummary ($ model); ?> = $form->Feld ($ model, 'thought') -> textInput (['maxlength' => 255])?> = $form->Feld ($ model, 'email') -> textInput () -> label (Yii :: t ('app', 'Ihre E-Mail-Adresse'))?> = $form->Feld ($ model, 'url') -> textInput () -> label (Yii :: t ('app', 'Ihre Website'))?>Hier sind die Validatoren in Aktion:
Dies ist offensichtlich sehr nützlich für Webanwendungen.
Der Exist Validator
Der ExistValidator ist in bestimmten Szenarien sehr nützlich. Es kann sicherstellen, dass ein Wert in einer anderen Tabelle vorhanden ist. Und es kann auf verschiedene Arten verwendet werden - hier einige Beispiele in der Dokumentation:
// a1 muss existieren ['a1', 'exist'] // a1 muss existieren, aber sein Wert verwendet a2, um die Existenz zu überprüfen ['a1', 'exist' ',' targetAttribute '=>' a2 ' ] // a1 und a2 müssen zusammen existieren, und beide erhalten die Fehlernachricht [['a1', 'a2'], 'exist' ',' targetAttribute '=> [' a1 ',' a2 ']] // a1 und a2 müssen zusammen existieren, nur a1 erhält die Fehlermeldung ['a1', 'exist' ',' targetAttribute '=> [' a1 ',' a2 ']] // a1 muss vorhanden sein, indem die Existenz von beiden überprüft wird a2 und a3 (mit dem a1-Wert) ['a1', 'existieren', 'targetAttribute' => ['a2', 'a1' => 'a3']]Die Yii-Dokumentation hebt hervor, dass mit Exist "überprüft werden kann, ob ein Fremdschlüssel einen Wert enthält, der in der Fremdtabelle gefunden werden kann".
In unserem Beispiel werde ich eine Regel erstellen, die überprüft, ob die E-Mail-Adresse im Formular bereits in unserer registrierten Benutzertabelle vorhanden ist. Dazu verwenden wir die targetClass, die Yii mitteilt, in welcher Klasse (oder Modelltabelle) die E-Mail-Adresse des Benutzers zur Überprüfung nachgeschlagen wird.
Hier ist der Regeldefinitions-Hinweis: Die Aufnahme unseres User-Modells oben:
255], [['email'], 'email'], [['email'], 'existieren', 'targetClass' => '\ app \ models \ User', 'message' => Yii :: t ( 'app', 'Entschuldigung, diese Person hat sich noch nicht registriert')], [['' url '],' url '],Dies weist Yii an, die User-Tabelle abzufragen, um sicherzustellen, dass die angegebene E-Mail-Adresse mit einem zuvor registrierten Benutzer übereinstimmt.
So sieht es in Aktion aus:
Sie können hier mehr über die Exist-Validierung und ihre Permutationen erfahren.
Die Datei- und Bildprüfer
Als Nächstes zeige ich Ihnen Beispiele für FileValidator, der die Existenz, den MIME-Typ und die Größe einer hochgeladenen Datei sicherstellt, sowie den ImageValidator, der das Bild und seine Eigenschaften überprüft.
Um die Datei- und Image-Validatoren kennenzulernen, wollen wir uns ein Beispiel aus der Reihe "Erstellen Sie Ihr Startup mit PHP" anschauen: Benutzereinstellungen, Profilbilder und Kontaktdetails. In dieser Episode im UserSettings-Modell können Benutzer eine Datei für ihr Profilbild hochladen.
Das Bildattribut akzeptiert die hochgeladene Datei:
public function rules () return [[['[user_id "]],' required '], [[' 'user_id' '],' unique '], [[' image '],' safe '], [[' 'image '],' file ',' extensions '=>' jpg, gif, png '], [[' 'image'], 'file', 'maxSize' => '100000'], ['image', 'image' , 'extensions' => 'png, jpg, gif', 'minWidth' => 100, 'maxWidth' => 400, 'minHeight' => 100, 'maxHeight' => 400,],Die FileValidatoren stellen sicher, dass das Image in einer richtigen Image-Erweiterung endet und weniger als 100.000 Byte umfasst.
Der ImageValidator überprüft außerdem den Erweiterungstyp sowie die Breiten- und Höhenbereiche für das Bild.
Hier ein Beispiel für Fehler, die durch das Hochladen eines Bildes erzeugt werden, dessen Abmessungen größer als 400 x 400 Pixel sind:
Das ist mein Assistent oben, der meine Tutorials gerne kopiert hat.
Der Bereich im Validator
Es gibt auch den RangeValidator, der sicherstellt, dass sich ein Wert innerhalb einer Liste zulässiger Einträge befindet.
In unserem Beispiel fügen wir das Feld für die Zensur wieder in das Formular ein:
= $form->errorSummary ($ model); ?> = $form->Feld ($ model, 'thought') -> textInput (['maxlength' => 255])?> = $form->Feld ($ model, 'email') -> textInput () -> label (Yii :: t ('app', 'Ihre E-Mail-Adresse'))?> = $form->Feld ($ model, 'url') -> textInput () -> label (Yii :: t ('app', 'Ihre Website'))?> = $form->Feld ($ model, 'censorship') -> textInput ()?> = $form->Feld ($ model, 'rank') -> textInput ()?> = $form->Feld ($ model, 'captcha') -> Widget (\ yii \ captcha \ Captcha :: classname (), [// zusätzliche Eigenschaften des Widgets hier konfigurieren])?>Dann fügen wir einen RangeValidator hinzu, um die Antwort an a anzupassen Ja oder Nein Zeichenfolge:
public function rules () return [[['[gedanke "],' Zeichenfolge ',' max '=> 255], [' Gedanke ',' Übereinstimmung ',' Muster '=>' / ^ [az] [A- Za-z,; \ "\\ s] + [!?.] $ / I ',' message '=> Yii :: t (' app ',' Ihre Gedanken sollten einen vollständigen Satz von Buchstaben bilden. ') ], [['email'], 'email'], [['' email '],' exist ',' targetClass '=>' \ app \ models \ User ',' message '=> Yii :: t (' app ',' Entschuldigung, diese Person hat sich noch nicht registriert ')], [[' 'url'], 'url'], ['zensur' ',' in ',' range '=> [' ja ',' Nein ',' Ja ',' Nein '],' Nachricht '=> Yii :: t (' app ',' Die Zensoren fordern eine Ja- oder Nein-Antwort. ')],Hier ist ein Beispiel für den RangeValidator in Aktion:
Der Übereinstimmungsprüfer für reguläre Ausdrücke
Sehen wir uns als Nächstes den RegularExpressionValidator an, der die Überprüfung anhand einer durch einen regulären Ausdruck definierten Bedingung durchführt.
In unserem Beispiel verwende ich die folgende Regex, um vollständige Sätze mit alphabetischen Buchstaben abzugleichen. Dies bedeutet, dass sie mit (!,? Oder.) Enden und keine numerischen Zeichen haben müssen.
public function rules () return [[['[gedanke "],' Zeichenfolge ',' max '=> 255], [' Gedanke ',' Übereinstimmung ',' Muster '=>' / ^ [az] [A- Za-z,; \ "\\ s] + [!?.] $ / I ',' message '=> Yii :: t (' app ',' Ihre Gedanken sollten einen vollständigen Satz von Buchstaben bilden. ') ],Hier ein Beispiel für eine Benutzereingabe, die den Test aufgrund der Anzahl und des fehlenden Interpunktionszeichens nicht bestanden hat:
Hier ist ein gültiger Satz:
Möglicherweise interessieren Sie sich auch für Acht reguläre Ausdrücke, die Sie kennen sollten (Tuts +), als Referenz für allgemeine Regex-Muster.
Der einzigartige Prüfer
Zum Schluss betrachten wir den UniqueValidator, der sicherstellt, dass ein Wert innerhalb einer Tabelle eindeutig ist, beispielsweise eine E-Mail-Adresse oder ein Slug.
Ich habe SluggableBehavior zuvor in dieser Serie durchgesehen und bietet eine eigene, einzigartige Unterstützung für Einzigartigkeit. Schauen wir uns jedoch noch ein paar weitere Beispiele aus der Reihe Building Your Startup With PHP an.
In der Codebasis für Meeting Planner (aus den jüngeren Tutorial-Episoden) im Place-Modell (
\ frontend \ models \ Place.php
) verwenden wir den einzigartigen Validator auf verschiedene Weise:public function rules () return [[['name', 'slug'], 'required'], [['' place_type ''), 'status', 'created_by', 'created_at', 'updated_at'], 'integer' ], [['name', 'google_place_id', 'slug', 'website', 'full_address', 'umgebung'], 'string', 'max' => 255], [['website'], 'url '], [[' 'slug'], 'unique'], [['' searchbox '],' unique ',' targetAttribute '=>' google_place_id '], [[' name ',' full_address '],' unique ' , 'targetAttribute' => ['name', 'full_address']],];Zuerst verwenden wir die eindeutige Regel mit dem Slug, um SluggableBehavior zu verbessern, was überflüssig ist. Sie können jedoch das Validierungsformat sehen.
Zweitens prüfen wir, ob die Ergebnisse des Google Places-Autocomplete-Suchfelds im ausgeblendeten Feld für angezeigt werden
google_place_id
einzigartig, da es noch nicht in der Places-Tabelle vorhanden ist. Wir verhindern im Wesentlichen doppelte Google Place-IDs.Das Wesentliche daran ist, dass wir mit dem einzigartigen Validator von Yii2 die Eindeutigkeit des sichtbaren Feldes erzwingen können (
Suchbox
) Während der Validierung in der sekundären Spalte, die über AJAX von Google zurückgegeben wurde (google_place_id
).Drittens stellen wir das sicher
Name
undvollständige Adresse
sind zusammen einzigartig. Mit anderen Worten, doppelte Ortsnamen sind in Ordnung. Es kann eine Bazillion Starbucks geben. Wir möchten jedoch nicht, dass jemand dieselbe Starbucks-Position zweimal betritt.Hinweis: Starbucks-Kaffee ist kein wirksames Stimulans für Softwareentwickler. Ich ermutige Sie, sich in unabhängigen Kaffeehäusern aufzuhalten.
Hier ist ein Beispiel dafür in Aktion:
Was kommt als nächstes?
Ich hoffe, Sie stimmen zu, wie einfach und nützlich Yii2-Validatoren für die Webentwicklung sind. Ich kann mir einfach nicht vorstellen, ohne Hilfe eines Frameworks zur Vanilla PHP-Entwicklung zurückzukehren.
Achten Sie auf kommende Tutorials in meiner Programmierreihe "Programmieren mit Yii2", während ich mich weiter mit verschiedenen Aspekten des Frameworks beschäftige. In der nächsten Episode werde ich die erweiterten Validierungsfunktionen von Yii2 wie die folgenden überprüfen:
- Bedingte Validierung zum Durchführen einer Validierungsregel nur, wenn ein bestimmtes Ereignis wahr ist
- Benutzerdefinierte Validatoren zum Erstellen grundlegender Validierungen, die über das hinausgehen, was Yii standardmäßig anbietet
- Client-seitige Validierung, um die integrierte ActiveForm-JavaScript-Validierung von Yii zu verwenden, ohne dass eine Aktualisierung der Seite erforderlich ist
- AJAX-Validierung für die Implementierung serverseitiger AJAX-Validierungen zur Erweiterung der clientseitigen JavaScript-Validierungsfunktionen von Yii.
- Validierungsereignisse zum Überschreiben der Validierung oder Ausführen bestimmter Funktionen vor und / oder nach der Validierung
- Definieren von Szenarien zum selektiven Anwenden von Regeln für bestimmte Situationen
- Ad-hoc-Validierung, um Validierungsregeln unabhängig von der Formularübermittlung zu verwenden
Ich freue mich über Feature- und Themenanfragen. Sie können sie in den Kommentaren unten posten, sich mit mir @reifman auf Twitter in Verbindung setzen oder mich bei Lookahead Consulting per E-Mail kontaktieren.
Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, können Sie auch meine Tuts + Instructor-Seite besuchen. Es enthält immer Links zu meinen Artikeln unmittelbar nach ihrer Veröffentlichung.
ähnliche Links
- Yii2 Anleitung zur Überprüfung der Benutzereingabe
- Yii2 Leitfaden für Validatoren
- Yii2-Validatoren (Dokumentation)
- Yii2 Developer Exchange, meine eigene Yii2-Ressourcenseite