Comment programmer avec Yii2 Validations spécialisées

Ce que vous allez créer

Si vous demandez, "Qu'est-ce que 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. Ce tutoriel est notre deuxième partie, consacrée aux 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. Plus précisément, nous allons explorer certaines des validations intégrées de spécialité communes au développement Web..

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

  • CaptchaValidator: Valide un champ de vérification de formulaire CAPTCHA.
  • CompareValidator: Compare deux valeurs du formulaire ou d'une constante, par ex. x doit être inférieur à 99.
  • EmailValidator: garantit qu'une valeur est une adresse électronique valide.
  • ExistValidator: assure qu'une valeur existe dans une autre table.
  • FileValidator: Assure l'existence d'un fichier téléchargé.
  • ImageValidator: Valide l'image et les propriétés de l'image.
  • RangeValidator: s'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.
  • UniqueValidator: s'assure que la valeur est unique dans une table, telle qu'une adresse électronique.
  • UrlValidator: garantit que la valeur est au format URL, par exemple. http://votredomaine.com.

Je vais vous guider à travers des exemples de chacune de ces validations à l'aide de la base de code de l'application Hello, tirée de didacticiels précédents, et d'un couple de notre série Building Your Startup, qui utilise également Yii2. 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 également me joindre à @reifman sur Twitter ou m'envoyer un email à Lookahead Consulting..

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.

Vous voudrez peut-être revenir à notre dernier épisode pour en savoir plus sur les validations de types de base de Yii2.

Maintenant, commençons par regarder la prochaine série de validateurs intégrés de Yii2.

La prochaine série de validateurs

Le validateur Captcha

Commençons par CaptchaValidator qui vérifie qu’il existe une réponse appropriée à un champ de vérification CAPTCHA. Les CAPTCHA aident à s'assurer qu'un humain remplit le formulaire, en évitant que les scripts automatisés ne le soumettent.

Voici un exemple du Yii Captcha en action:

Dans notre base de code Hello, j'ai simplifié notre exemple de formulaire pour inclure uniquement les champs Thought et Captcha. Voici un aperçu des définitions de règles du code du modèle:

class Exemple de rallonge \ yii \ db \ ActiveRecord public $ captcha; / ** * @inheritdoc * / règles de fonction publique () return [[['' pensée '],' chaîne ',' max '=> 255], [[' pensée '],' trim '], [[' pensé '],' requis '], [[' captcha '],' captcha '],]; 

Le captcha ne fait pas partie de notre schéma de base de données. Il sert uniquement à vérifier le formulaire. Par conséquent, j’ai ajouté un attribut au modèle, par exemple. public $ captcha;.

Voici le code d'affichage du formulaire. Nous devons inclure la bibliothèque Captcha en haut.

 
errorSummary ($ model); ?> champ ($ modèle, 'pensé') -> textInput (['maxlength' => 255])?> field ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: nom de classe (), [// configure les propriétés de widget supplémentaires ici])?>
isNewRecord? 'Create': 'Update', ['class' => $ model-> isNewRecord? 'btn btn-success': 'btn btn-primary'])?>

Voici à quoi ressemble la validation Captcha en action:

Si vous cliquez sur le Captcha, Yii générera une nouvelle image..

Le validateur de comparaison

Passons maintenant à CompareValidator. Ce validateur compare deux valeurs du formulaire ou une seule valeur de formulaire à une constante, telle que x doit être inférieur à 99..

Pour cet exemple, je veux m'assurer que l'entrée utilisateur pour le rang est supérieure à zéro mais inférieure ou égale à 100..

Tout d'abord, je vais ajouter le champ de saisie à notre formulaire pour l'attribut rank:

 errorSummary ($ model); ?> champ ($ modèle, 'pensé') -> textInput (['maxlength' => 255])?> champ ($ modèle, 'rang') -> textInput ()?> field ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: nom de classe (), [// configure les propriétés de widget supplémentaires ici])?> 

Ensuite, je vais ajouter deux règles de validation de comparaison à notre modèle:

 règles de fonction publique () retour [[['' pensée '],' chaîne ',' max '=> 255], [[' pensée '],' trim '], [[' pensée '],' obligatoire '] , [['' captcha '],' captcha '], [[' rang '],' entier '], [' rang ',' compare ',' compareValue '=> 0,' operator '=>'> '] , ['rank', 'compare', 'compareValue' => 100, 'operator' => '<='], ];  

Vous pouvez voir une liste complète des opérateurs de comparaison disponibles ici.

Voici à quoi ressemble notre formulaire lorsque l'utilisateur soumet un attribut non valide:

Si nous voulons fournir les règles de contrainte spécifiques dans un seul message d'erreur, Yii Validators vous permet de personnaliser l'erreur affichée à l'utilisateur, comme ceci:

La mise en œuvre est assez simple avec l'ajout de l'attribut de message:

règles de fonction publique () retour [[['' pensée '],' chaîne ',' max '=> 255], [[' pensée '],' trim '], [[' pensée '],' obligatoire '] , [['' captcha '],' captcha '], [[' rang '],' entier '], [' rang ',' compare ',' compareValue '=> 0,' operator '=>'> ', 'message' => Yii :: t ('app', 'le classement doit être compris entre 0 et 100 inclus.')], ['rank', 'compare', 'compareValue' => 100, 'operator' => '<=','message'=>Yii :: t ('app', 'Le classement doit être compris entre 0 et 100 inclus.')],]; 

Mise à jour de notre schéma pour tester plus de validations

Pour certains de ces prochains tests de validation, je vais vous demander d’ajouter quelques champs à la base de données..

Dans \ migrations \ m150219_235923_create_sample_table.php, nous ajouterons de nouveaux champs pour tester le prochain ensemble de validateurs: email, URL, nom de fichier, etc..

$ this-> createTable ('% sample', ['id' => Schéma :: TYPE_PK, 'pensé' => Schéma :: TYPE_STRING. 'NOT NULL DEFAULT "", "Bien" => Schéma :: 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', 'email' => Schema :: TYPE_STRING. 'NOT NULL DEFAULT "" "," url "=> Schema: TYPE_STRING." NOT NULL DEFAULT "" "," nom du fichier "=> Schema :: TYPE_STRING. 'NOT NULL', 'avatar' => Schéma :: TYPE_STRING. 'NOT NULL',], $ tableOptions); 

Ensuite, lancez la migration vers le bas pour supprimer la table puis remontez:

Admins-MBP: hello Jeff $ ./yii migrate / down 1 Outil de migration Yii (basé sur Yii v2.0.2) Total 1 migration à annuler: m150219_235923_create_sample_table Annuler la migration ci-dessus? (yes | no) [no]: yes *** annulation de la conversion de m150219_235923_create_sample_table> table drop % sample… done (heure: 0,002s) *** annulée m150219_235923_create_sample_table (heure: 0,005 secondes). Admins-MBP: hello Jeff $ ./yii migrate / up 1 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 de m150219_235923_create_sample_table> créer une table % sample… done (heure: 0,007s) *** appliquée m150219_235923_create_sample_table (heure: 0.010s) Migration réussie.

Nous sommes maintenant prêts à tester les validateurs de courrier électronique et d'URL.

Validateurs Email & URL

EmailValidator garantit qu'une valeur est une adresse électronique valide et UrlValidator garantit une valeur au format URL, par exemple. http://votredomaine.com. 

C'est assez simple de créer des règles pour nos nouveaux champs d'e-mail et d'URL:

 règles de fonction publique () return [[['' pensée '],' chaîne ',' max '=> 255], [[' email '],' email '], [[' url '],' url '], 

Voici le code d'affichage du formulaire. Notez que j'utilise des étiquettes personnalisées pour améliorer la convivialité du formulaire:

errorSummary ($ model); ?> champ ($ modèle, 'pensé') -> textInput (['maxlength' => 255])?> field ($ model, 'email') -> textInput () -> label (Yii :: t ('app', 'Votre adresse email'))?> field ($ model, 'url') -> textInput () -> label (Yii :: t ('app', 'Votre site Web'))?>

Voici les validateurs en action:

Celles-ci sont évidemment très utiles pour les applications Web.

Le validateur existant

ExistValidator est extrêmement utile dans certains scénarios. Cela permet de s'assurer qu'une valeur existe dans une autre table. Et il peut être utilisé de différentes manières. En voici quelques exemples dans la documentation:

// a1 doit exister ['a1', 'exist'] // a1 doit exister, mais sa valeur utilisera a2 pour vérifier l'existence ['a1', 'exist', 'targetAttribute' => 'a2' ] // a1 et a2 doivent exister ensemble et ils recevront tous les deux un message d'erreur [['' a1 ',' a2 '],' exist ',' targetAttribute '=> [' a1 ',' a2 ']] // a1 et a2 doivent exister ensemble, seul a1 recevra le message d'erreur ['a1', 'exist', 'targetAttribute' => ['a1', 'a2']] // a1 doit exister en vérifiant l'existence des deux a2 et a3 (en utilisant la valeur a1) ['a1', 'exist', 'targetAttribute' => ['a2', 'a1' => 'a3']]

La documentation Yii souligne que Exist peut être utilisé pour "vérifier qu'une clé étrangère contient une valeur pouvant être trouvée dans la table étrangère".

Pour notre exemple, je vais créer une règle qui vérifie que l'adresse électronique du formulaire existe déjà dans notre table d'utilisateurs enregistrés. Pour ce faire, nous utilisons la targetClass qui indique à Yii quelle classe (ou table modèle) rechercher l'adresse de messagerie de l'utilisateur pour validation.. 

Voici la définition de la règle - notez l'inclusion de notre modèle d'utilisateur en haut:

 255], [['' email '],' email '], [[' 'email'], 'exist', 'targetClass' => '\ app \ models \ User', 'message' => Yii :: t ( 'app', 'Désolé, cette personne n'est pas encore enregistrée')], [['' url '],' url '],

Cela ordonne à Yii d'interroger la table User pour s'assurer que l'adresse électronique fournie correspond à un utilisateur déjà enregistré.

Voici à quoi ça ressemble en action:

Vous pouvez en apprendre plus sur la validation Exist et ses permutations ici.

Les validateurs de fichiers et d'images

Ensuite, je vais vous montrer des exemples de FileValidator, qui garantit l'existence, le type MIME et la taille d'un fichier téléchargé, et ImageValidator, qui valide l'image et ses propriétés..

Pour explorer les validateurs de fichiers et d'images, examinons un exemple tiré de la série Construire votre démarrage avec PHP: Paramètres utilisateur, Images de profil et Détails de contact. Dans cet épisode du modèle UserSettings, nous autorisons les utilisateurs à télécharger un fichier pour leur image de profil..

L'attribut image accepte le fichier téléchargé:

 règles de fonction publique () return [[['user_id',], 'required'], [['user_id',], 'unique'], [['image'], 'safe'], [['image '],' fichier ',' extensions '=>' jpg, gif, png '], [[' 'image'], 'fichier', 'maxSize' => '100000'], ['image', 'image' , 'extensions' => 'png, jpg, gif', 'minWidth' => 100, 'maxWidth' => 400, 'minHeight' => 100, 'maxHeight' => 400,], 

Les FileValidators veillent à ce que l'image se termine par une extension d'image correcte et comporte moins de 100 000 octets.. 

ImageValidator vérifie également le type d’extension, ainsi que les plages de largeur et de hauteur de l’image..

Voici un exemple d'erreur générée en téléchargeant une image dont les dimensions sont supérieures à 400 x 400 pixels:

C'est mon assistant qui a l'habitude de copier mes tutoriels.

La gamme dans Validator

Il y a aussi le RangeValidator qui assure qu'une valeur est dans une liste d'entrées autorisées. 

Pour notre exemple, ajoutons le champ de censure dans le formulaire:

errorSummary ($ model); ?> champ ($ modèle, 'pensé') -> textInput (['maxlength' => 255])?> field ($ model, 'email') -> textInput () -> label (Yii :: t ('app', 'Votre adresse email'))?> field ($ model, 'url') -> textInput () -> label (Yii :: t ('app', 'Votre site Web'))?> champ ($ modèle, 'censure') -> textInput ()?> champ ($ modèle, 'rang') -> textInput ()?> field ($ model, 'captcha') -> widget (\ yii \ captcha \ Captcha :: nom de classe (), [// configure les propriétés de widget supplémentaires ici])?>

Ensuite, nous ajouterons un RangeValidator pour faire correspondre la réponse à un Oui ou non chaîne:

 règles de fonction publique () return [[['' pensée ''], 'chaîne', 'max' => 255], ['pensée', 'correspondance', 'modèle' => '/ ^ [az] [A- Za-z,; \ "\\ s] + [!?.] $ / I ',' message '=> Yii :: t (' app ',' Vos pensées doivent former une phrase complète de caractères alphabétiques. ') ], [['' email '],' email '], [[' 'email'], 'exist', 'targetClass' => '\ app \ models \ User', 'message' => Yii :: t (' app ',' Désolé, cette personne n'est pas encore enregistrée ')], [[' 'url'], 'url'], ['censure', 'dans', 'range' => ['oui', ' non ',' Oui ',' Non '],' message '=> Yii :: t (' app ',' Les censeurs exigent une réponse par oui ou par non. ')],

Voici un exemple de RangeValidator en action:

Le validateur de correspondance d'expression régulière

Ensuite, examinons RegularExpressionValidator, qui effectue la validation par rapport à une condition définie par une expression régulière.. 

Dans notre exemple, j'utilise l'expression régulière suivante pour faire correspondre des phrases complètes à des caractères alphabétiques. Cela signifie qu'ils doivent se terminer par (!,? Ou.) Et ne pas avoir de caractères numériques.

 règles de fonction publique () return [[['' pensée ''], 'chaîne', 'max' => 255], ['pensée', 'correspondance', 'modèle' => '/ ^ [a] Za-z,; \ "\\ s] + [!?.] $ / I ',' message '=> Yii :: t (' app ',' Vos pensées doivent former une phrase complète de caractères alphabétiques. ') ], 

Voici un exemple d'entrée utilisateur qui échoue au test en raison des chiffres et de l'absence d'un signe de ponctuation à la fin:

Voici une phrase valide:

Vous pourriez également être intéressé par huit expressions régulières que vous devriez connaître (Tuts +) comme référence pour les motifs de regex courants.

Le validateur unique

Enfin, passons en revue UniqueValidator, qui garantit qu’une valeur est unique dans une table, telle qu’une adresse électronique ou un slug..

J'ai déjà examiné SluggableBehavior plus tôt dans cette série, qui offre son propre support intégré d'unicité. Cependant, examinons quelques exemples supplémentaires de la série Construire sa startup avec PHP. 

Dans la base de code de Meeting Planner (tiré des épisodes de didacticiel plus récents), dans le modèle Place (\ frontend \ models \ Place.php), nous utilisons le validateur unique de plusieurs manières:

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']],]; 

Premièrement, nous utilisons la règle unique avec le slug pour augmenter SluggableBehavior, qui est redondant; mais vous pouvez voir le format de validation.

Deuxièmement, nous vérifions que les résultats de la zone de recherche de la zone de saisie semi-automatique de Google Adresses aboutissent au champ masqué de google_place_id étant unique en ce sens qu'il n'existe pas encore dans la table des lieux. Nous évitons essentiellement les identifiants Google Place en double.. 

L’essentiel de ceci est que le validateur unique de Yii2 nous permet d’appliquer l’unicité sur le champ visible (Barre de recherche) Tout en le validant sur la colonne secondaire renvoyée via AJAX par Google (google_place_id).

Troisièmement, nous veillons à ce que prénom et adresse complète sont uniques ensemble. En d'autres termes, les noms de lieux en double sont acceptables. Il peut y avoir un bazillion Starbucks. Cependant, nous ne voulons pas que deux personnes entrent deux fois au même endroit Starbucks..

Remarque: Le café Starbucks n’est pas un stimulant efficace pour les développeurs de logiciels. Je vous encourage à fréquenter les cafés indépendants.

Voici un exemple de cela en action:

Et après?

J'espère que vous conviendrez de la simplicité et de l'utilité des validateurs Yii2 pour le développement Web. Je ne peux tout simplement pas imaginer revenir au développement PHP à la vanille sans l'aide d'un framework.

Surveillez les prochains tutoriels de ma série Programming With Yii2 pendant que je continue à plonger dans différents aspects du cadre. Dans le prochain épisode, je vais passer en revue les fonctionnalités de validation avancées de Yii2 telles que:

  • Validation conditionnelle pour exécuter une règle de validation uniquement si un événement spécifique est true
  • 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.
  • Événements de validation pour remplacer la validation ou exécuter une fonctionnalité spécifique avant et / ou après validation
  • Définition de scénarios pour appliquer de manière sélective des règles dans certaines situations
  • Validation ad hoc pour utiliser les règles de validation indépendamment de la soumission du formulaire

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

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

Liens connexes

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