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. In diesem Tutorial werde ich Ihnen die Validatoren von Yii2 vorstellen. 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.
Für diese Beispiele werden wir weiterhin die Hello-Anwendungscodebase verwenden, die wir in früheren Tutorials verwendet haben. 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.
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).. Normalerweise möchten Sie nur sicherstellen, dass die von den 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.
Hier ist eine Liste der eingebauten Yii-Validatoren und Links zur Dokumentation:
So beschreibt Yii den Validierungsfluss. Normalerweise können Sie das Standardszenario verwenden und müssen kein eigenes Szenario erstellen. Im Allgemeinen müssen Sie sich auf Gii verlassen, um Regeln zu erstellen oder eigene Regeln zu schreiben.
Wenn der bestätigen()
Methode aufgerufen wird, durchläuft es die folgenden Schritte, um die Validierung durchzuführen:
Gemäß den obigen Validierungsschritten wird ein Attribut nur dann und nur dann geprüft, wenn es sich um ein aktives Attribut handelt, das in deklariert ist Szenarien ()
und ist einer oder mehreren aktiven Regeln zugeordnet, die in deklariert sind Regeln ()
.
So kann ein Satz von Modellvalidierungsregeln aussehen. Ich habe diese aus der Meeting Planner-Anwendung Place model genommen:
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']],];
Wenn Sie unsere eigenen Validierungsbeispiele weiter unten implementieren, erfahren Sie, was jede der obigen Definitionen darstellt.
Es gibt mehrere Möglichkeiten, auf die durch die Überprüfung zurückgegebenen Fehler zuzugreifen.
Hier ein Beispiel für das Abrufen der Fehlergruppe im Controller:
$ model = new \ app \ models \ ContactForm; // Modellattribute mit Benutzereingaben füllen $ model-> attributes = \ Yii :: $ app-> request-> post ('ContactForm'); if ($ model-> validate ()) // alle Eingaben sind gültig else // Überprüfung fehlgeschlagen: $ errors ist ein Array mit Fehlernachrichten $ errors = $ model-> errors;
Und hier ist ein Beispiel, wie Sie Yiis errorSummary-Funktion in ActiveForms nutzen können:
= $form->errorSummary ($ model); ?>So sieht es aus:
Erweiterte Validierung
In späteren Episoden werde ich auch Beispiele für die Verwendung erweiterter Validierungsfunktionen geben:
- Definieren von Szenarien zum selektiven Anwenden von Regeln für bestimmte Situationen
- Definieren benutzerdefinierter Fehlermeldungen
- Validierungsereignisse zum Überschreiben der Validierung oder Ausführen bestimmter Funktionen vor und / oder nach der Validierung
- Bedingte Validierung zum Durchführen einer Validierungsregel nur, wenn ein bestimmtes Ereignis wahr ist
- Ad-hoc-Validierung, um Validierungsregeln unabhängig von der Formularübermittlung zu verwenden
- 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
Beginnen wir zunächst mit Beispielen für die verschiedenen Arten von eingebauten Validatoren.
Grundlegende Feldprüfer
Schauen wir uns einige der grundlegenden Feldvalidatoren an, die für die tägliche Implementierung von Formularen hilfreich sind.
Vorbereiten eines Modells mit Migrationen und Gii
Wie wir es in den ersten Episoden dieser Serie getan haben, werde ich eine Migration erstellen:
./ yii migrieren / erstellen create_sample_tableIch werde ein Beispielmodell erstellen, um einige Beispielschemas und Validierungen mit Gii zu erstellen. Hier ist der Migrationscode:
db-> driverName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'; $ 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',], $ tableOptions); public function down () $ this-> dropTable ('% sample');Dann führen wir die Migration aus:
./ yii migrieren / up Yii Migration Tool (basierend auf Yii v2.0.2) Insgesamt 1 neu anzuwendende Migration: 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,009s) *** angewendet m150219_235923_create_sample_table (Zeit: 0.015s) Migriert erfolgreich.Dann verwenden wir den Codegenerator von Yii, um ein Modell zu erstellen:
Und dann CRUD-Dateien:
Gii generiert diese Beispielvalidierungsregeln:
class Sample erweitert \ yii \ db \ ActiveRecord public function rules () return [[[['' Güte ',' Rang '],' Ganzzahl '], [[' 'Rang' ',' Zensur ',' aufgetreten '],' erforderlich '], [[' 'ist aufgetreten'], 'sicher'], [['' dachte ',' Zensur '],' string ',' max '=> 255]];Lassen Sie uns diese nun verwenden, um mit einigen der grundlegenden Validatoren zu arbeiten und durchzugehen.
Erforderlicher Validator
Der RequiredValidator stellt sicher, dass ein Wert vorhanden ist. Sie können es an Ort und Stelle für Rang, Zensur und Vorkommnis sehen.
Besuchen Sie das von Gii generierte Mustererstellungsformular, z. http: // localhost: 8888 / hallo / sample / create. Die ActiveForm-JavaScript-Client-Validierung von Yii zeigt eine Fehlermeldung an, selbst wenn Sie sich von einem dieser Felder entfernen.
Sicherer Validator
Der SafeValidator ist kein echter Validator. Es ermöglicht die massive Zuweisung eines veröffentlichten Webformulars, um ein Attribut aufzunehmen. z.B. $ model-> attributes = $ _POST ['Kommentar']. Oder Sie können in dem von Gii erstellten SampleController diesen Code sehen:
öffentliche Funktion 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,]);Ohne die sichere Regel im Mustermodell (oder einer anderen Regel) würde der aufgetretene Wert den Modellattributen nicht zugewiesen. Dies verringert die Wahrscheinlichkeit eines zusätzlichen Angriffsvektors ohne absichtlichen Code.
Regeln für öffentliche Funktionen () return [[['[aufgetreten]],' sicher '],Standardwert-Prüfer
Der DefaultValueValidator ist kein wahrer Prüfer. Sie legt Standardwerte für leere Felder fest.
Ändern wir die Regel für
aufgetreten
um einen Standardwert mit dem aktuellen Datum festzulegen. Wir entfernen außerdem den erforderlichen Prüfer, damit der Standardprüfer den Wert füllen kann.öffentliche Funktionsregeln () return [[[['' Güte ',' Rang '],' Ganzzahl '], [[' Rang ',' Zensur '],' erforderlich '], // Gii hat dies erstellt // [[' aufgetreten '],' safe '], [' aufgetreten ',' default ',' value '=> date ("Ymd")],Wenn wir ein neues Sample erstellen und die
aufgetreten
In diesem Feld können Sie sehen, dass die resultierende Ansicht das aktuelle Datum enthält, das vom Standardwertprüfer eingetragen wird.Filter
Der FilterValidator ist auch kein echter Validator. Es führt eine Transformation für einen bereitgestellten Wert durch. Am häufigsten können Sie dies verwenden, um Leerzeichen an den Enden einer Zeichenfolge zu entfernen.
FilterValidators werden mit Inline-Funktionsrückrufen definiert, z. B. mit dieser benutzerdefinierten Überprüfungsfunktion:
// ein Inline-Validator, der als anonyme Funktion definiert ist ['token', function ($ -Attribut, $ params) if (! ctype_alnum ($ this -> $ attribute)) $ this-> addError ($ attribute, 'Das Token muss Buchstaben oder Ziffern enthalten. '); ],Da trim eine native PHP-Funktion ist, können wir unsere Validierungsregel einfach inline deklarieren:
[['' dachte '],' trimmen '],Wenn Sie ein Formular mit vorausgehenden oder nachgestellten Leerzeichen im Gedankenfeld absenden, werden diese vom FilterValidator entfernt.
Schauen wir uns nun einige der integrierten Validatoren an.
Die Typprüfer
Typenvalidierer stellen sicher, dass die Benutzerdaten bestimmten Typen entsprechen, oft den im Datenbankschema angegebenen. Gii generiert diese automatisch.
String und Number Validator
Der StringValidator stellt sicher, dass ein Wert eine Zeichenfolge ist. Der NumberValidator stellt sicher, dass ein Wert numerisch ist, z. Ganzzahl oder Float.
Hier sind Beispiele für Regeldefinitionen:
Regeln für öffentliche Funktionen () return [[[['' Güte ',' Rang '],' Ganzzahl '], [[' Gedanken ',' Zensur ']', 'Zeichenfolge', 'max' => 255] // [[ 'Rang', 'Zensur'], 'erforderlich'],Ich entferne auch vorübergehend die erforderliche Überprüfung, um zu sehen, wie die Überprüfung von Zeichenfolgen und Zahlen unabhängig voneinander funktioniert.
So sehen die Überprüfungsfehlermeldungen aus:
Güte als hoch versagt, weil es keine Zahl ist, während Rang 27 durchgeht. Die Zensur ist leer (NULL) und die Überprüfung der Zeichenfolge schlägt fehl.
Boolean Validator
Der BooleanValidator stellt sicher, dass ein Wert true oder false ist. Sie können die Werte für wahr und falsch definieren. Die Standardwerte sind Integer 0 oder 1. Dieser Prüfer kann nützlicher sein, wenn das Feld mit einem Dropdown-Selektor verwendet wird, z. Ja Nein.
So habe ich meine Regel für Boolean definiert:
public function rules () return [[['' goodness '],' boolean '], [[' 'rank'], 'integer'],Hier ist die Fehlermeldung des booleschen Prüfers:
Datumsüberprüfung
Der DateValidator stellt sicher, dass es sich bei dem Wert um ein ordnungsgemäß formatiertes Datum handelt, das mit einem Formatattribut angepasst werden kann. Bei Yii ActiveForm handelt es sich derzeit um eine serverseitige Validierung. Daher fügte ich auch eine erforderliche Regel für das Feld Occurred hinzu.
Hier sind meine Regeldefinitionen mit dem Datums-Validierer für das Feld "Eingelegt":
public function rules () return [[['' goodness '],' boolean '], [[' 'rank'], 'integer'], [['gedacht'], 'zensur'], 'string', 'max' => 255], [['rank', 'Zensur', 'aufgetreten'], 'erforderlich'], ['aufgetreten', 'Datum', 'Format' => 'yyyy-M-d'], // ['ist aufgetreten', 'default', 'value' => Datum ("Ymd")], [['' dachte '],' trimmen '],];So sieht es aus, wenn wir das Formular absenden:
Was kommt als nächstes?
Achten Sie auf kommende Tutorials in meiner Programmierreihe "Programmieren mit Yii2", während ich mich weiter mit verschiedenen Aspekten des Frameworks beschäftige. In den nächsten beiden Episoden werde ich Sie durch die verbleibenden Validatoren führen und Ihnen zeigen, wie Sie erweiterte Erweiterungen für das Validierungs-Framework von Yii erstellen.
Vielleicht möchten Sie auch die Serie "Erstellen Sie Ihr Startup mit PHP" ausprobieren, die die erweiterte Vorlage von Yii2 verwendet, während ich eine Anwendung aus der realen Welt baue.
Ich freue mich über Feature- und Themenanfragen. Sie können sie in den Kommentaren unten posten, mich auf @reifman auf Twitter pingen oder mich auf meiner Lookahead Consulting-Website per E-Mail benachrichtigen.
Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, besuchen Sie meine Tuts + Instructor-Seite. Es enthält immer alle meine Artikel unmittelbar nach ihrer Veröffentlichung.
ähnliche Links
- Yii2 Anleitung zur Überprüfung der Benutzereingabe
- Yii2-Validatoren (Dokumentation)
- Yii2 Developer Exchange, meine Website für Yii2-Ressourcen