Comment programmer avec Yii2 Validations

Ce que vous allez créer

Si vous demandez, "c'est quoi Yii?" Découvrez mon tutoriel précédent: Introduction au framework Yii, qui passe en revue les avantages de Yii et inclut un aperçu des nouveautés de Yii 2.0, publiées en octobre 2014.

Dans cette série de programmation avec Yii2, je guide les lecteurs dans l'utilisation du framework Yii2 pour PHP récemment mis à jour. Dans ce tutoriel, je vais vous présenter les validateurs de Yii2. Les validateurs simplifient le code nécessaire à la validation de l'entrée, c'est-à-dire vérifient la conformité ou la non-conformité de l'entrée de données, généralement de la part des utilisateurs via des formulaires Web..

Pour ces exemples, nous allons continuer à exploiter la base de code de l'application Hello que nous avons utilisée dans les didacticiels précédents. Utilisez les liens GitHub sur cette page pour obtenir le code.

Juste un rappel, je participe aux commentaires ci-dessous. Je suis particulièrement intéressé si vous avez des idées supplémentaires ou si vous souhaitez suggérer des sujets pour de futurs tutoriels. Vous pouvez aussi me joindre à @reifman sur Twitter. 

Qu'est-ce qu'un validateur??

Si vous êtes un développeur Web, vous savez probablement que les entrées de l'utilisateur ne sont pas fiables. Par exemple, les utilisateurs peuvent utiliser des techniques d'injection SQL pour essayer d'exécuter des requêtes qui modifient ou exposent des mots de passe.. Quelqu'un a une fois utilisé l'injection SQL contre mon installation open source PHPList et a réussi à découvrir l'un de mes mots de passe (PHPList les a stockés en texte brut). Plus généralement, vous voulez simplement vous assurer que les données fournies par les utilisateurs sont conformes aux types, formulaires et plages de votre application..

Construire des validateurs PHP à la main prend du temps. Le framework Yii fournit une tonne de fonctionnalités de validation de base, il n’est donc pas nécessaire de les construire à partir de zéro. Mais, si vous avez besoin d'extensions personnalisées, c'est tout aussi simple..

Les validations sont une autre raison pour laquelle je pense qu'il est toujours judicieux de créer des applications sur un framework Web tel que Yii plutôt que PHP vanilla..

Dans les épisodes précédents, nous avons également beaucoup parlé du générateur de code de Yii, Gii. Un des avantages de Gii est qu’il écrira les règles de validation appropriées pour vos modèles en fonction des définitions de type SQL du schéma. C'est un gros gain de temps.

Quelles sont les validations prises en charge par Yii??

Voici une liste des validateurs Yii intégrés et des liens vers la documentation:

  • BooleanValidator. Assure qu'une valeur est vraie ou fausse.
  • CaptchaValidator. Valide un champ de vérification de formulaire CAPTCHA.
  • CompareValidator. Compare deux valeurs de la forme ou d'une constante, par ex. x doit être inférieur à 99.
  • DateValidator. Assure que la valeur est une date.
  • DefaultValueValidator. Pas un vrai validateur. Définit les valeurs par défaut pour les champs vides.
  • NumberValidator. Assure qu'une valeur est numérique, par ex. entier ou float.
  • EmailValidator. Assure qu'une valeur est une adresse email valide.
  • ExistValidator. Assure qu'une valeur existe dans une autre table.
  • FileValidator. Assure l'existence d'un fichier téléchargé.
  • FilterValidator. Pas un vrai validateur. Effectue une transformation sur la valeur fournie.
  • ImageValidator. Valide l'image et les propriétés de l'image.
  • RangeValidator. Assure qu'une valeur est dans une liste de valeurs.
  • RegularExpressionValidator. Effectue la validation par rapport à une condition définie par une expression régulière.
  • RequiredValidator. Assure qu'une valeur est présente.
  • SafeValidator. Pas un vrai validateur. Permet l'affectation massive d'un formulaire Web publié pour inclure un attribut. par exemple. $ modèle-> attributs = $ _POST ['Comment'];
  • StringValidator. Assure que la valeur est une chaîne.
  • UniqueValidator. S'assure que la valeur est unique dans une table, telle qu'une adresse électronique.
  • UrlValidator. S'assure que la valeur est au format URL, par exemple. http://votredomaine.com

Comment fonctionne la validation Yii

Voici comment Yii décrit le flux de validation. En règle générale, vous pouvez utiliser le scénario par défaut sans avoir à créer le vôtre. Vous devrez généralement compter sur Gii pour générer des règles ou écrire vos propres.

Quand le valider() Si la méthode est appelée, elle passe par les étapes suivantes pour effectuer la validation:

  1. Déterminez quels attributs doivent être validés en obtenant la liste d'attributs de yii \ base \ Model :: scenario () à l'aide du scénario actuel. Ces attributs sont appelés attributs actifs.
  2. Déterminez les règles de validation à utiliser en extrayant la liste des règles de yii \ base \ Model :: rules () à l'aide du scénario actuel. Ces règles s'appellent règles actives
  3. Utilisez chaque règle active pour valider chaque attribut actif associé à la règle. Les règles de validation sont évaluées dans l'ordre dans lequel elles sont répertoriées..

Selon les étapes de validation ci-dessus, un attribut sera validé si et seulement s’il s’agit d’un attribut actif déclaré dans scénarios () et est associé à une ou plusieurs règles actives déclarées dans règles().

Exemple de règles de validation de modèle

Voici à quoi peut ressembler un ensemble de règles de validation de modèle. J'ai pris ceux-ci de l'application Meeting Planner, modèle Place:

 règles de fonction publique () return [['' nom '', 'slug'], 'requis'], [['type_emplacement', 'statut', 'created_by', 'created_at', 'updated_at'], 'entier' ], [['nom', 'google_place_id', 'slug', 'site web', 'adresse complète', 'environs'], 'chaîne', 'max' => 255], [['site web'], 'url '], [[' 'slug'], 'unique'], [['searchbox'], 'unique', 'targetAttribute' => 'google_place_id'], [['nom', 'adresse complète'], 'unique' , 'targetAttribute' => ['nom', 'adresse complète']],]; 

Au fur et à mesure que nous implémentons nos propres exemples de validation ci-dessous, vous apprendrez ce que chacune des définitions ci-dessus représente..

Exemple d'affichage des erreurs

Il existe deux manières d'accéder aux erreurs renvoyées par la validation.. 

Voici un exemple d'obtention du tableau d'erreurs dans le contrôleur:

$ model = new \ app \ models \ ContactForm; // remplit les attributs du modèle avec les entrées utilisateur $ model-> attributs = \ Yii :: $ app-> request-> post ('ContactForm'); if ($ model-> validate ()) // toutes les entrées sont valides else // la validation a échoué: $ errors est un tableau contenant des messages d'erreur $ errors = $ model-> errors; 

Et voici un exemple d'utilisation de la fonction errorSummary de Yii dans ActiveForms:

errorSummary ($ model); ?>

Voici à quoi ça ressemble:

Validation Avancée

Dans les épisodes suivants, je donnerai également des exemples d'utilisation de fonctionnalités de validation avancées:

  • Définition de scénarios pour appliquer de manière sélective des règles dans certaines situations
  • Définir des messages d'erreur personnalisés
  • Événements de validation pour remplacer la validation ou exécuter une fonctionnalité spécifique avant et / ou après validation
  • Validation conditionnelle pour exécuter une règle de validation uniquement si un événement spécifique est true
  • Validation ad hoc pour utiliser les règles de validation indépendamment de la soumission du formulaire
  • Des validateurs personnalisés pour créer des validations essentielles allant au-delà de ce que Yii propose immédiatement
  • Validation côté client pour utiliser la validation JavaScript ActiveForm intégrée de Yii sans nécessiter d'actualisation de page
  • Validation AJAX pour la mise en œuvre de validations AJAX côté serveur afin d'étendre les capacités de validation de page JavaScript côté client de Yii

Pour l'instant, commençons par parcourir des exemples des différents types de validateurs intégrés.

Validateurs de champ de base

Examinons quelques-uns des validateurs de terrain de base utiles pour la mise en œuvre quotidienne de formulaires.

Préparation d'un modèle à l'aide de migrations et de Gii

Comme nous l'avons fait dans les premiers épisodes de cette série, je vais créer une migration:

./ yii migrate / create create_sample_table

Je vais créer un exemple de modèle pour créer un exemple de schéma et de validations à l'aide de Gii. Voici le code de migration:

db-> nomDuPort === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('% sample', ['id' => Schema :: TYPE_PK, 'pensait' => Schema :: TYPE_STRING. 'NOT NULL DEFAULT "", "goodness" => Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'rank' => Schéma :: TYPE_INTEGER. 'NOT NULL', 'censure' => Schéma :: TYPE_STRING. 'NOT NULL', 's'est produit' => Schéma :: TYPE_DATE. 'NOT NULL',], $ tableOptions);  public function down () $ this-> dropTable ('% sample'); 

Ensuite, nous lancerons la migration:

./ yii migrate / up Yii Outil de migration (basé sur Yii v2.0.2) Total 1 nouvelle migration à appliquer: m150219_235923_create_sample_table Appliquer la migration ci-dessus? (yes | no) [no]: yes *** application m150219_235923_create_sample_table> créer une table % sample… done (heure: 0,009s) *** appliquée m150219_235923_create_sample_table (heure: 0.015s) Migration réussie. 

Ensuite, nous utiliserons le générateur de code de Yii pour construire un modèle:

Et puis les fichiers CRUD:

Gii génère ces exemples de règles de validation:

class Sample étend \ yii \ db \ ActiveRecord règles de fonction publique () return [['' goodness ',' rank '],' entier '], [[' rang ',' censure ',' survenu '],' requis '], [[' 's'est produit'], 'sûr'], [['pensé', 'censure'], 'chaîne', 'max' => 255]]; 

Maintenant, utilisons-les pour travailler avec et parcourir quelques-uns des validateurs de base.

Validateur requis

RequiredValidator garantit qu'une valeur est présente. Vous pouvez le voir en place ci-dessus pour le rang, la censure et a eu lieu.

Consultez le formulaire Sample Create généré par Gii, par exemple. http: // localhost: 8888 / hello / sample / create. La validation du client JavaScript ActiveForm de Yii affiche un message d'erreur même lorsque vous vous éloignez de l'un de ces champs.

Validateur sécurisé

SafeValidator n'est pas un vrai validateur. Il permet l'affectation massive d'un formulaire Web publié pour inclure un attribut. par exemple. $ modèle-> attributs = $ _POST ['Comment']. Ou bien, dans le SampleController créé par Gii, vous pouvez voir le code suivant:

fonction publique actionCreate () $ model = new Sample (); if ($ model-> load (Yii :: $ app-> request-> post ()) && $ model-> save ()) return $ this-> redirect (['view', 'id' => $ modèle-> id]);  else return $ this-> render ('create', ['model' => $ model,]); 

Sans la règle de sécurité dans le modèle Sample (ou une autre règle), la valeur survenue ne serait pas affectée aux attributs du modèle. Cela réduit la probabilité d'un vecteur d'attaque supplémentaire sans code délibéré.

règles de fonction publique () return [[['' s'est produit '],' sûr '],

Validateur de valeur par défaut

DefaultValueValidator n'est pas un vrai validateur. Il définit les valeurs par défaut pour les champs vides.

Changeons la règle pour eu lieu pour définir une valeur de date par défaut en utilisant la date actuelle. Nous allons également supprimer le validateur requis pour permettre au validateur par défaut de renseigner la valeur..

règles de fonction publique () return [[['' bonté '', 'rang'], 'entier'], [['rang', 'censure'], 'obligatoire'], // Gii a créé ceci // [[' s'est produite '],' safe '], [' s'est produite ',' default ',' value '=> date ("Ymd")],

Lorsque nous créons un nouvel échantillon et quittons le eu lieu champ vide, vous pouvez voir que la vue résultante inclut la date actuelle renseignée par le validateur de valeur par défaut.

Les filtres

FilterValidator n'est pas non plus un vrai validateur. Il effectue une transformation sur une valeur fournie. Le plus souvent, vous pouvez utiliser ceci pour réduire les espaces blancs aux extrémités d'une chaîne. 

Les FilterValidators sont définis avec des rappels de fonction en ligne tels que cette fonction de validation personnalisée:

// un validateur en ligne défini comme une fonction anonyme ['token', function ($ attribut, $ params) if (! ctype_alnum ($ this -> $ attribut)) $ this-> addError ($ attribut, 'Le jeton doit contenir des lettres ou des chiffres. '); ],

Puisque trim est une fonction PHP native, nous pouvons simplement déclarer notre règle de validation en ligne:

 [['pensée'], 'trim'], 

Si vous soumettez un formulaire avec des espaces en attente ou à la fin du champ de pensée, FilterValidator les supprimera..

Maintenant, regardons quelques-uns des validateurs de type intégrés.

Les validateurs de type

Les validateurs de type garantissent que les données utilisateur sont conformes à des types spécifiques, souvent ceux spécifiés dans votre schéma de base de données. Gii les générera automatiquement.

Validateur de chaîne et de nombre

StringValidator garantit qu'une valeur est une chaîne. NumberValidator garantit qu'une valeur est numérique, par exemple. entier ou float. 

Voici des exemples de définitions de règles:

 règles de fonction publique () return [[['' goodness '' ',' rank '' ',' entier '], [[' 'pensée' ',' censure '],' chaîne ',' max '=> 255] // [[ 'rang', 'censure'], 'obligatoire'], 

Je supprime aussi temporairement la validation requise pour voir comment les validations de chaîne et de numéro fonctionnent indépendamment.

Voici à quoi ressembleront les messages d'erreur de validation:

La bonté en tant que haut échoue parce que ce n'est pas un nombre, alors que la rangée sur 27 passe. La censure est vide (NULL) et échoue la validation de la chaîne.

Validateur Booléen

BooleanValidator garantit qu'une valeur est vraie ou fausse. Vous pouvez définir les valeurs pour vrai et faux. Les valeurs par défaut sont les entiers 0 ou 1. Ce validateur peut être plus utile lorsque le champ est utilisé avec un sélecteur déroulant, par ex. Oui Non.

Voici comment j'ai défini ma règle pour le booléen:

 règles de fonction publique () return [[['' goodness '],' boolean '], [[' rank '],' integer '], 

Voici le message d'erreur du validateur booléen:

Date Validator

DateValidator garantit que la valeur est une date correctement formatée pouvant être personnalisée avec un attribut de format. Avec Yii ActiveForm, il s’agit d’une validation côté serveur. Par conséquent, j’ai également rajouté une règle requise pour le champ.

Voici mes définitions de règles avec le validateur de date pour le champ Evénement:

règles de fonction publique () return [[['' goodness '],' boolean '], [[' rank '],' entier '], [[' pensée ',' censure '],' chaîne ',' max ' => 255], [['rang', 'censure', 'survenu'], 'obligatoire'], ['survenu', 'date', 'format' => 'aaaa-M-d'], // ['s'est produit', 'défaut', 'valeur' ​​=> date ("jmd")], [["pensée"], "trim"],]; 

Voici à quoi ça ressemble quand nous soumettons le formulaire:

Et après?

Surveillez les prochains tutoriels de ma série Programming With Yii2 pendant que je continue à plonger dans différents aspects du cadre. Dans les deux prochains épisodes, je vais vous guider à travers les validateurs restants et vous montrer comment construire des extensions avancées du cadre de validation de Yii..

Vous pouvez également consulter ma série Construire votre démarrage avec PHP, qui utilise le modèle avancé de Yii2 pour créer une application du monde réel..

Je me félicite des demandes de fonctionnalités et de sujets. Vous pouvez les poster dans les commentaires ci-dessous, me envoyer un ping @reifman sur Twitter ou m'envoyer un email sur mon site Lookahead Consulting.

Si vous souhaitez savoir quand le prochain tutoriel Yii2 arrive, consultez ma page d'instructeur Tuts +. Il inclut toujours tous mes articles immédiatement après leur publication.. 

Liens connexes

  • Yii2 Guide de validation de la saisie utilisateur
  • Yii2 Validators (Documentation)
  • Yii2 Developer Exchange, mon site de ressources Yii2