Validation des Données
La validation des données est une partie importante de toute application,
puisqu’elle permet de s’assurer que les données d’un model respectent les
règles métiers de l’application. Par exemple, vous aimeriez vérifier que les
mots de passe sont longs d’au moins huit caractères ou bien vous assurer que
les noms d’users sont uniques. La définition des règles de validation
facilite grandement la gestion des formulaires.
Il y a de nombreux aspects différents dans le processus de validation. Ce
que nous aborderons dans cette section c’est le côté model des choses. En
résumé : ce qui se produit lorsque vous appelez la méthode save() de votre
model. Pour obtenir plus d’informations sur la manière d’afficher les erreurs
de validation, regardez la section traitant des helpers
FormHelper.
La première étape pour la validation de données est de créer les règles dans
le Model. Pour ce faire, utilisez le tableau Model::validate dans la
définition du model, par exemple:
class User extends AppModel {
public $validate = array();
}
Dans l’exemple ci-dessus, le tableau $validate
est ajouté au model
User, mais ce tableau ne contient pas de règles de validation.
En supposant que la table « users » ait les champs « login »,
« email » et « date_de_naissance », l’exemple ci-dessous
montre quelques règles simples de validation qui s’appliquent à ces champs:
class User extends AppModel {
public $validate = array(
'login' => 'alphaNumeric',
'email' => 'email',
'date_de_naissance' => 'date'
);
}
Ce dernier exemple montre comment des règles de validation peuvent être
ajoutées aux champs d’un model. Pour le champ “login”, seules les lettres
et les chiffres sont autorisés, l’email doit être valide et la date de
naissance doit être une date valide. La définition de règles de validation
active l’affichage « automagique » de messages d’erreurs dans les formulaires
par CakePHP, si les données saisies ne respectent pas les règles définies.
CakePHP a de nombreuses règles et leur utilisation peut être très simple.
Certaines de ces règles intégrées vous permettent de vérifier le format des
adresses emails, des URLs, des numéros de carte de crédit, etc. - mais nous
couvrirons cela en détail plus loin.
Voici un autre exemple de validation plus complexe qui tire profit de
quelques-unes de ces règles pré-définies:
class User extends AppModel {
public $validate = array(
'login' => array(
'alphaNumeric' => array(
'rule' => 'alphaNumeric',
'required' => true,
'message' => 'Chiffres et lettres uniquement !'
),
'between' => array(
'rule' => array('lengthBetween', 5, 15),
'message' => 'Entre 5 et 15 caractères'
)
),
'password' => array(
'rule' => array('minLength', '8'),
'message' => '8 caractères minimum'
),
'email' => 'email',
'date_de_naissance' => array(
'rule' => 'date',
'message' => 'Entrez une date valide',
'allowEmpty' => true
)
);
}
Deux règles de validation sont définies pour le login : il doit contenir
des lettres et des chiffres uniquement et sa longueur doit être comprise
entre 5 et 15. Le mot de passe doit avoir au minimum 8 caractères. L’email
doit avoir un format correct et la date de naissance être une date valide.
Vous pouvez voir dans cet exemple comment personnaliser les messages que
CakePHP affichera en cas de non respect de ces règles.
Comme le montre l’exemple ci-dessus, un seul champ peut avoir plusieurs règles
de validation. Si les règles pré-définies ne correspondent pas à vos critères,
vous pouvez toujours ajouter vos propres règles de validation, selon vos
besoins.
Maintenant que nous avons vu, en gros, comment la validation fonctionne, voyons
comment ces règles sont définies dans le model. Il y a trois manières
différentes pour définir les règles de validation : tableaux simples, une règle
par champ et plusieurs règles par champ.
Règles simples
Comme le suggère le nom, c’est la manière la plus simple de définir une
règle de validation. La syntaxe générale pour définir des règles de cette
manière est:
public $validate = array('nomChamp' => 'nomRegle');
Où “nomChamp” est le nom du champ pour lequel la règle est définie, et
“nomRegle” est un nom prédéfini, comme “alphaNumeric”, “email” ou “isUnique”.
Par exemple, pour s’assurer que l’user fournit une adresse email
correcte, vous pouvez utiliser cette règle:
public $validate = array('user_email' => 'email');
Une règle par champ
Cette technique de définition permet un meilleur contrôle sur le fonctionnement
des règles de validation. Mais avant d’aborder ce point, regardons le schéma
d’utilisation général pour ajouter une règle à un seul champ:
public $validate = array(
'champ1' => array(
'rule' => 'nomRegle', // ou bien : array('nomRegle', 'parametre1', 'parametre2' ...)
'required' => true,
'allowEmpty' => false,
'on' => 'create', // ou bien: 'update'
'message' => 'Votre message d\'erreur'
)
);
La clé “rule” est obligatoire. Si vous définissez uniquement
“required” => true, la validation du formulaire ne fonctionnera pas
correctement. C’est à cause du fait que “required” n’est pas à proprement
parlé une règle.
Comme vous pouvez le voir ici, chaque champ (un seul est présenté ci-dessus)
est associé à un tableau contenant cinq clés : “rule”, “required”,
“allowEmpty”, “on” et “message”. Toutes les clés sont optionnelles sauf
“rule”. Regardons en détail ces clés.
La clé “rule”
La clé “rule” définit la méthode de validation et attend soit une valeur
simple, soit un tableau. La règle spécifiée peut-être le nom d’une méthode
dans votre model, une méthode de la classe globale Validation ou une
expression régulière. Pour une liste complète des règles pré-définies,
allez voir Règles de validation incluses.
Si la règle ne nécessite pas de paramètre, “rule” peut-être une simple
valeur, comme:
public $validate = array(
'login' => array(
'rule' => 'alphaNumeric'
)
);
Si la règle nécessite quelques paramètres (tels que un maximum, un
minimum ou une plage de valeurs), “rule” doit être un tableau:
public $validate = array(
'password' => array(
'rule' => array('minLength', 8)
)
);
Souvenez-vous, la clé “rule” est obligatoire pour les définitions de
règles sous forme de tableau.
La clé “required”
Cette clé doit être définie par une valeur booléenne, ou create
ou
update
. Si “required” est true
alors le champ doit être présent
dans le tableau de données. Tandis que mettre le champ à create
ou
update
rendra le champ nécessaire seulement lors des opérations de
création ou de mise à jour. Par exemple, si la règle de validation a
été définie comme suit:
public $validate = array(
'login' => array(
'rule' => 'alphaNumeric',
'required' => true
)
);
Les données envoyées à la méthode save() du model doivent contenir des
données pour le champ “login”. Dans le cas contraire, la validation
échouera. La valeur par défaut de cette clé est le booléen “false”.
required => true
ne signifie pas la même chose que la règle de validation
notBlank()
. required => true
indique que la clé du tableau doit être
présente - cela ne veut pas dire qu’elle doit avoir une valeur. Par
conséquent, la validation échouera si le champ n’est pas présent dans le jeu
de données, mais pourra réussir (en fonction de la règle) si la valeur soumise
est vide (“”).
Modifié dans la version 2.1: Le support pour create
et update
a été ajouté.
La Clé “allowEmpty”
Si définie à false
, la valeur du champ doit être non vide, ceci
étant déterminé par !empty($value) || is_numeric($value)
. La vérification
numérique est là pour que CakePHP fasse ce qu’il faut quand $valeur
vaut
zéro.
La différence entre required
et allowEmpty
peut être confuse.
'required' => true
signifie que vous ne pouvez pas sauvegarder le model,
si la clé pour ce champ n’est pas présente dans $this->data
(la
vérification est réalisé avec isset) ; tandis que 'allowEmpty' => false
s’assure que la valeur du champ courant est « non vide », comme décrit
ci-dessus.
La clé “on”
La clé “on” peut prendre l’une des valeurs suivantes : “update” ou “create”.
Ceci fournit un mécanisme qui permet à une règle donnée d’être appliquée
pendant la création ou la mise à jour d’un enregistrement.
Si une règle est définie à “on” => “create”, elle sera seulement appliquée
lors de la création d’un nouvel enregistrement. Autrement, si elle est
définie à “on” => “update”, elle s’appliquera uniquement lors de la mise
à jour de l’enregistrement.
La valeur par défaut pour “on” est “null”. Quand “on” est null, la règle
s’applique à la fois pendant la création et la mise à jour.
La clé “message”
La clé “message” vous permet de définir un message d’erreur de validation
personnalisé pour la règle:
public $validate = array(
'password' => array(
'rule' => array('minLength', 8),
'message' => 'Le mot de passe doit comporter au moins 8 caractères'
)
);
Note
Quelque soit la règle, l’échec de validation sans un message défini par
défaut sera « This field cannot be left blank. » (Ce champ ne peut être
laissé vide)
Plusieurs règles par champ
La technique que nous venons de voir nous donne plus de flexibilité que
l’assignation simple de règles, mais il y a une étape supplémentaire que
nous pouvons mettre en œuvre, pour avoir un contrôle encore plus fin sur la
validation des données. La prochaine technique que nous allons voir nous
permet d’affecter plusieurs règles de validation par champ de model.
Si vous souhaitiez affecter plusieurs règles de validation à un seul champ,
voici basiquement comment il faudrait faire:
public $validate = array(
'nomChamp' => array(
'nomRegle' => array(
'rule' => 'nomRegle',
// clés supplémentaires comme 'on', 'required', etc. à mettre ici
),
'nomRegle2' => array(
'rule' => 'nomRegle2',
// clés supplémentaires comme 'on', 'required', etc. à mettre ici
)
)
);
Comme vous pouvez le voir, cela ressemble beaucoup à ce que nous avons vu
dans la section précédente. Ici pour chaque champ, nous avons uniquement un
tableau de paramètres de validation. Dans ce cas, chaque “nomChamp” est un
tableau de règles indexé. Chaque “nomRegle” contient un tableau indépendant
de paramètres de validation.
Ce sera plus explicite avec un exemple pratique:
public $validate = array(
'login' => array(
'regleLogin-1' => array(
'rule' => 'alphaNumeric',
'message' => 'Lettres et chiffres uniquement',
'last' => true
),
'regleLogin-2' => array(
'rule' => array('minLength', 8),
'message' => 'Taille minimum de 8 caractères'
)
)
);
L’exemple ci-dessus définit deux règles pour le champ “login”: “regleLogin-1”
et “regleLogin-2”. Comme vous pouvez le voir, chaque règle est identifiée avec
un nom arbitraire.
Quand vous utilisez des règles multiples par champ, les clés “required” et
“allowEmpty” doivent être utilisées seulement une fois dans la première règle.
La clé “last”
Dans le cas de règles multiples par champ, si une des règles échoue, le message
d’erreur pour cette règle va par défaut être retourné et les règles suivantes
pour ce champ ne seront pas testées. Si vous voulez que la validation continue
bien qu’une règle ait échouée, définissez la clé last
à false
pour
cette règle.
Dans l’exemple suivant, même si « rule1 » échoue « rule2 » va être testée
et les messages d’erreur pour les deux règles ayant échoués seront retournées
si « rule2 » échoue aussi:
public $validate = array(
'login' => array(
'rule1' => array(
'rule' => 'alphaNumeric',
'message' => 'Only alphabets and numbers allowed',
'last' => false
),
'rule2' => array(
'rule' => array('minLength', 8),
'message' => 'Minimum length of 8 characters'
)
)
);
Quand vous spécifiez des règles de validation dans ce tableau de formulaire, il
est aussi possible d’éviter de fournir la clé message
. Regardez cette
exemple:
public $validate = array(
'login' => array(
'Only alphabets and numbers allowed' => array(
'rule' => 'alphaNumeric',
),
)
);
Si les règles de alphaNumeric
échouent, la clé du tableau pour cette règle
“Only alphabets and numbers allowed” sera retourné en message d’erreur si la
clé message
n’est pas définie.
Règles personnalisées de validation des données
Si ce qui précède ne vous convient pas, vous pouvez toujours créer vos propres
règles de validation. Il y a deux moyens de réaliser cela : en définissant
des expressions régulières ou en créant des méthodes de validation
personnalisées.
Validation avec Expression Régulière personnalisée
Si la technique de validation dont vous avez besoin peut être complétée par
l’utilisation d’une expression régulière, vous pouvez définir une expression
personnalisée comme une règle de validation de champ:
public $validate = array(
'login' => array(
'rule' => '/^[a-z0-9]{3,}$/i',
'message' => 'Seulement des lettres et des entiers, minimum 3 caractères'
)
);
L’exemple ci-dessus vérifie que le login contient seulement des lettres et des
entiers et qu’il a au minimum trois caractères.
L’expression régulière dans rule
doit être délimitée par des slashes (/).
Le “i” final optionnel après le dernier slash signifie que l’expression
régulière est insensible à la casse.
Ajouter vos propres méthodes de validation
Parfois, la vérification des données par un motif d’expression régulière ne
suffit pas. Par exemple, si vous voulez vous assurer qu’un coupon de réduction
(code promo) n’est pas utilisé plus de 25 fois, vous devez ajouter votre
propre méthode de validation, comme indiqué ci-dessous:
class User extends AppModel {
public $validate = array(
'code_promo' => array(
'rule' => array('limiteUtilisations', 25),
'message' => 'Ce code promo a dépassé son nombre maximal d\'utilisation.'
)
);
public function limiteUtilisations($check, $limit) {
// $check aura comme valeur : array('code_promo' => 'une valeur')
// $limit aura comme valeur : 25
$compteurCodeActuel = $this->find('count', array(
'conditions' => $check,
'recursive' => -1
));
return $compteurCodeActuel < $limit;
}
}
Le champ en cours de validation est passé à la fonction comme premier
paramètre, sous la forme d’un tableau associatif avec le nom du champ
comme clé et les données postées comme valeur.
Si vous voulez passer des paramètres supplémentaires à votre fonction de
validation, ajoutez des éléments dans le tableau “rule” et manipulez-les
comme des paramètres supplémentaires (après le paramètre principal $check
)
dans votre fonction.
Votre fonction de validation peut être dans le model (comme dans l’exemple)
ou dans un behavior (comportement) que votre model implémente. Ceci inclut
les méthodes mappées.
Les méthodes des models/behaviors sont vérifiées en premier, avant de
chercher pour une méthode dans la classe Validation
. Cela veut dire que
vous pouvez surcharger les méthodes de validation existantes (telle que
alphaNumeric()
) au niveau de l’application (en ajoutant la méthode dans
AppModel
) ou au niveau du model.
Quand vous écrivez une règle de validation qui peut être utilisée par
plusieurs champs, prenez soin d’extraire la valeur du champ du tableau
$check. Le tableau $check est passé avec le nom du champ comme clé et la
valeur du champ comme valeur. Le champ complet qui doit être validé est
stocké dans une variable de $this->data:
class Post extends AppModel {
public $validate = array(
'slug' => array(
'rule' => 'alphaNumericDashUnderscore',
'message' => 'Le slug ne peut contenir que des lettres, des nombres, des tirets ou des underscores.'
)
);
public function alphaNumericDashUnderscore($check) {
// le tableau $check est passé en utilisant le nom du champ de formulaire comme clé
// nous devons extraire la valeur pour rendre la fonction générique
$valeur = array_values($check);
$valeur = $valeur[0];
return preg_match('|^[0-9a-zA-Z_-]*$|', $valeur);
}
}
Note
Vos propres méthodes de validation doivent avoir une visibilité public
.
Les méthodes de Validation qui sont protected
et private
ne sont
pas supportées.
Cette méthode devrait retourner true
si la valeur est valide. Si la
validation échoue, elle retourne false
. L’autre valeur de retour valide
est une chaîne de caractères qui sera montrée en message d’erreur. Retourner
une chaîne de caractères signifie que la validation a échoué. La chaîne de
caractère va surcharger le message défini dans le tableau $validate et sera
montré dans le formulaire de vue comme la raison pour laquelle le champ n’est
pas valide.
Changer dynamiquement les règles de validation
Utiliser la propriété $validate
pour déclarer les règles de validation est
une bonne façon de définir des règles statiques pour chaque model. Néanmoins,
il y a d’autres cas où vous voudrez ajouter, modifier ou retirer dynamiquement
des règles de validation d’un ensemble pré-défini.
Toutes les règles de validation sont stockées dans un objet ModelValidator
,
qui contient chaque règle pour chaque champ définie dans votre model. Définir
de nouvelles règles de validation est aussi facile que de dire à cet objet
de stocker de nouvelles méthodes de validation pour les champs que vous
souhaitez.
Ajouter de nouvelles règles de validation
Nouveau dans la version 2.2.
Les objets ModelValidator
permettent de nombreuses façons d’ajouter de
nouveaux champs à définir. Le premier est l’utilisation de la méthode add
:
// Dans une classe de model
$this->validator()->add('password', 'required', array(
'rule' => 'notBlank',
'required' => 'create'
));
Cela va ajouter une règle simple au champ password
dans le model. Vous
pouvez chainer plusieurs appels à ajouter pour créer autant de règles que vous
souhaitez:
// Dans une classe de model
$this->validator()
->add('password', 'required', array(
'rule' => 'notBlank',
'required' => 'create'
))
->add('password', 'size', array(
'rule' => array('lengthBetween', 8, 20),
'message' => 'Password should be at least 8 chars long'
));
Il est aussi possible d’ajouter des règles multiples en une fois pour un
champ unique:
$this->validator()->add('password', array(
'required' => array(
'rule' => 'notBlank',
'required' => 'create'
),
'size' => array(
'rule' => array('lengthBetween', 8, 20),
'message' => 'Password should be at least 8 chars long'
)
));
De façon alternative, vous pouvez utiliser l’objet validator pour définir
les règles directement aux champs en utilisant l’interface de tableau:
$validator = $this->validator();
$validator['username'] = array(
'unique' => array(
'rule' => 'isUnique',
'required' => 'create'
),
'alphanumeric' => array(
'rule' => 'alphanumeric'
)
);
Modifier les règles de validation courantes
Nouveau dans la version 2.2.
Modifier les règles de validation courantes est aussi possible en utilisant
l’objet validator, il y a plusieurs façons pour modifier les règles courantes,
les méthodes d’ajout à un champ ou le retrait complet d’une règle à partir
d’une règle définie d’un champ:
// Dans une classe de model
$this->validator()->getField('password')->setRule('required', array(
'rule' => 'required',
'required' => true
));
Vous pouvez aussi complètement remplacer toutes les règles pour un champ en
utilisant une méthode similiare:
// Dans une classe de model
$this->validator()->getField('password')->setRules(array(
'required' => array(...),
'otherRule' => array(...)
));
Si vous souhaitez juste modifier une propriété unique dans une règle,
vous pouvez définir des propriétés directement dans l’objet
CakeValidationRule
:
// Dans une classe de model
$this->validator()->getField('password')
->getRule('required')->message = 'This field cannot be left blank';
Les propriétés dans toute CakeValidationRule
sont nommées selon les clés
valides de tableau autorisées à utiliser quand vous définissez des propriétés
de règles de comme les clés de tableau “message” et “allowEmpty” par exemple.
Comme avec l’ajout de nouvelle règle à l’ensemble, il est aussi possible de
modifier les règles existantes en utilisant l’interface de tableau:
$validator = $this->validator();
$validator['username']['unique'] = array(
'rule' => 'isUnique',
'required' => 'create'
);
$validator['username']['unique']->last = true;
$validator['username']['unique']->message = 'Name already taken';
Retirer des règles d’un ensemble
Nouveau dans la version 2.2.
Il est possible de retirer complètement toutes les règles pour un champ ou de
supprimer une règle unique dans un ensemble de règles de champ:
// Retire complètement toutes les règles pour un champ
$this->validator()->remove('username');
// Retire la règle 'required' de password
$this->validator()->remove('password', 'required');
De façon optionnelle, vous pouvez utiliser l’interface de tableau pour
supprimer les règles à partir d’un ensemble:
$validator = $this->validator();
// Retire complètement toutes les règles pour un champ
unset($validator['username']);
// Retire la règle 'required' de password
unset($validator['password']['required']);
Règles de validation incluses
-
class Validation
La classe de validation de CakePHP contient un certain nombre de règles
prédéfinies, qui rendent la validation des données plus simple dans vos
models. Cette classe contient de nombreuses règles souvent utilisées que
vous n’aurez pas à ré-écrire vous même. Ci-dessous vous trouverez une liste
complète de toutes les règles, illustrées par des exemples d’utilisation.
-
static Validation::alphaNumeric(mixed $check)
Les données pour ce champ ne doivent contenir que chiffres et lettres:
public $validate = array(
'login' => array(
'rule' => 'alphaNumeric',
'message' => 'Les données pour ce champ ne doivent contenir que lettres et chiffres.'
)
);
-
static Validation::between(string $check, integer $min, integer $max)
La longueur des données du champ doit être comprise dans la plage
numérique spécifiée. Les valeurs minimum et maximum doivent être toutes
les deux fournies. Cette méthode utilise <= et non <:
public $validate = array(
'mot_de_passe' => array(
'rule' => array('between', 5, 15),
'message' => 'Le mot de passe doit avoir une longueur comprise entre 5 et 15 caractères.'
)
);
Les données sont vérifiées avec le nombre de caractères, et pas avec le
nombre de bytes.
-
static Validation::blank(mixed $check)
Cette règle est utilisée pour vérifier que le champ est laissé vide ou que
seulement des caractères blancs y sont présents. Les caractères blancs
incluent l’espace, la tabulation, le retour chariot et nouvelle ligne.
public $validate = array(
'id' => array(
'rule' => 'blank',
'on' => 'create'
)
);
-
static Validation::boolean(string $check)
Les données pour ce champ doivent être une valeur booléenne. Les valeurs
possibles sont : true ou false, les entiers 0 ou 1, les chaînes “0” ou
“1”.
public $validate = array(
'maCaseACocher' => array(
'rule' => array('boolean'),
'message' => 'Valeur incorrecte pour maCaseACocher'
)
);
-
static Validation::cc(mixed $check, mixed $type = 'fast', boolean $deep = false, string $regex = null)
Cette règle est utilisée pour vérifier si une donnée est un numéro de
carte de crédit valide. Elle prend trois paramètres : “type”, “deep” et
“regex”.
Le paramètre “type” peut être assigné aux valeurs “fast”, “all” ou à
l’une des suivantes :
amex
bankcard
diners
disc
electron
enroute
jcb
maestro
mc
solo
switch
visa
voyager
Si “type” est défini à “fast”, cela valide les données de la majorité des
formats numériques de cartes de crédits. Définir “type” à “all” vérifiera
tous les types de cartes de crédits. Vous pouvez aussi définir “type”
comme un tableau des types que vous voulez détecter.
Le paramètre “deep” devrait être défini comme une valeur booléenne. S’il
est défini à true, la validation vérifiera l’algorithme Luhn de la carte
de crédit
(https://en.wikipedia.org/wiki/Luhn_algorithm).
Par défaut, elle est à false.
Le paramètre “regex” vous permet de passer votre propre expression
régulière, laquelle sera utilisée pour valider le numéro de la carte de
crédit:
public $validate = array(
'numero_cc' => array(
'rule' => array('cc', array('visa', 'maestro'), false, null),
'message' => 'Le numéro de carte de crédit que vous avez saisi était invalide.'
)
);
-
static Validation::comparison(mixed $check1, string $operator = null, integer $check2 = null)
Comparison est utilisé pour comparer des valeurs numériques. Il supporte
« est supérieur », « est inférieur », « supérieur ou égal », « inférieur ou
égal », « égal à » et « non égal ». Quelques exemples sont indiqués
ci-dessous:
public $validate = array(
'age' => array(
'rule' => array('comparison', '>=', 18),
'message' => 'Vous devez avoir 18 ans au moins pour vous inscrire.'
)
);
public $validate = array(
'age' => array(
'rule' => array('comparison', 'greater or equal', 18),
'message' => 'Vous devez avoir 18 ans au moins pour vous inscrire.'
)
);
-
static Validation::custom(mixed $check, string $regex = null)
Utilisé quand une règle personnalisée est nécessaire:
public $validate = array(
'infinite' => array(
'rule' => array('custom', '\u221E'),
'message' => 'Merci de rentrer un nombre infini.'
)
);
-
static Validation::date(string $check, mixed $format = 'ymd', string $regex = null)
Cette règle s’assure que les données soumises sont dans des formats de date
valides. Un seul paramètre (qui peut être un tableau) doit être passé
et sera utilisé pour vérifier le format de la date soumise. La valeur
de ce paramètre peut être l’une des suivantes :
“dmy”, par exemple : 27-12-2006 ou 27-12-06 (les séparateurs peuvent
être l’espace, le point, le tiret, le slash)
“mdy”, par exemple : 12-27-2006 ou 12-27-06 (les séparateurs peuvent
être l’espace, le point, le tiret, le slash)
“ymd”, par exemple : 2006-12-27 ou 06-12-27 (les séparateurs peuvent
être l’espace, le point, le tiret, le slash)
“dMy”, par exemple : 27 Décembre 2006 ou 27 Déc 2006
“Mdy”, par exemple : Décembre 27, 2006 ou Déc 27, 2006 (la virgule
est optionnelle)
“My”, par exemple : (Décembre 2006 ou Déc 2006)
“my”, par exemple : 12/2006 ou 12/06 (les séparateurs peuvent être
l’espace, le point, le tiret, le slash)
“ym” par ex. 2006/12 ou 06/12 (les séparateurs peuvent être un espace,
une période, un tiret, ou un slash)
“y” e.g. 2006 (les séparateurs peuvent être un espace, une période,
un tiret, ou un slash)
Si aucune clé n’est soumise, la clé par défaut “ymd” sera utilisée:
public $validate = array(
'date_de_naissance' => array(
'rule' => array('date', 'ymd'),
'message' => 'Entrez une date valide au format AA-MM-JJ.',
'allowEmpty' => true
)
);
Etant donné que de nombreux moteurs de stockage réclament un certain
format de date, vous devriez envisager de faire le plus gros du travail
en acceptant un large choix de formats et en essayant de les convertir,
plutôt que de forcer les gens à les soumettre dans un format donné. Le
plus de travail vous ferez pour les users, le mieux ce sera.
Modifié dans la version 2.4: Les formats ym
et y
ont été ajoutés.
-
static Validation::datetime(array $check, mixed $dateFormat = 'ymd', string $regex = null)
Cette règle s’assure que les données sont dans un format datetime valide.
Un paramètre (qui peut être un tableau) peut être passé pour spécifier le
format de la date. La valeur du paramètre peut être une ou plusieurs des
valeurs suivantes:
“dmy”, par exemple : 27-12-2006 or 27-12-06 (les séparateurs peuvent
être l’espace, le point, le tiret, le slash)
“mdy”, par exemple : 12-27-2006 or 12-27-06 (les séparateurs peuvent
être l’espace, le point, le tiret, le slash)
“ymd”, par exemple : 2006-12-27 or 06-12-27 (les séparateurs peuvent
être l’espace, le point, le tiret, le slash)
“dMy”, par exemple : 27 December 2006 or 27 Dec 2006
“Mdy”, par exemple : December 27, 2006 or Dec 27, 2006 (le point est
optionnel)
“My”, par exemple : (December 2006 or Dec 2006)
“my”, par exemple : 12/2006 or 12/06 (les séparateurs peuvent
être l’espace, le point, le tiret, le slash)
Si aucune clé n’est fournie, la clé par défaut qui sera utilisée est
“ymd”:
public $validate = array(
'birthday' => array(
'rule' => array('datetime', 'dmy'),
'message' => 'Merci de rentrer une date et un time valide.'
)
);
Un second paramètre peut aussi être passé pour spécifier une expression
réguière personnalisée. Si un paramètre est utilisé, ce sera la seule
validation qui apparaitra.
Notez que au contraire de date(), datetime() validera une date et un time.
-
static Validation::decimal(string $check, integer $places = null, string $regex = null)
Cette règle s’assure que la donnée est un nombre décimal valide. Un
paramètre peut être passé pour spécifier le nombre de décimales requises
après le point. Si aucun paramètre n’est passé, la donnée sera validée
comme un nombre scientifique à virgule flottante, entraînant une erreur
si aucune décimale n’est trouvée après le point:
public $validate = array(
'prix' => array(
'rule' => array('decimal', 2)
)
);
-
static Validation::email(string $check, boolean $deep = false, string $regex = null)
Celle-ci vérifie que la donnée est une adresse email valide. En passant
un booléen true comme second paramètre de cette règle, elle tentera de
vérifier aussi, que l’hôte de l’adresse est valide:
public $validate = array('email' => array('rule' => 'email'));
public $validate = array(
'email' => array(
'rule' => array('email', true),
'message' => 'Merci de soumettre une adresse email valide.'
)
);
-
static Validation::equalTo(mixed $check, mixed $compareTo)
Cette règle s’assurera que la valeur est égale à la valeur passée et
qu’elle est du même type.
public $validate = array(
'nourriture' => array(
'rule' => array('equalTo', 'gâteau'),
'message' => 'Cette valeur devrait être la chaîne gâteau'
)
);
-
static Validation::extension(mixed $check, array $extensions = array('gif', 'jpeg', 'png', 'jpg'))
Cette règle vérifie les extensions valides de fichier, comme .jpg ou .png.
Permet la vérification d’extensions multiples, en les passant sous forme
de tableau.
public $validate = array(
'image' => array(
'rule' => array('extension', array('gif', 'jpeg', 'png', 'jpg')),
'message' => 'Merci de soumettre une image valide.'
)
);
-
static Validation::fileSize($check, $operator = null, $size = null)
Cette règle vous permet de vérifier les tailles de fichier. Vous pouvez
utiliser $operator
pour décider du type de comparaison que vous
souhaitez utiliser. Tous les opérateurs supportés par
comparison()
sont ici aussi supportés. Cette
méthode va gérer automatiquement les tableaux de valeur à partir de
$_FILES
en lisant la clé tmp_name
si $check
est un tableau qui
contient cette clé:
public $validate = array(
'image' => array(
'rule' => array('fileSize', '<=', '1MB'),
'message' => 'L\'Image doit être inférieur à 1MB'
)
);
Nouveau dans la version 2.3: Cette méthode a été ajoutée dans 2.3
-
static Validation::inList(string $check, array $list, boolean $caseInsensitive = false)
Cette règle s’assurera que la valeur est dans un ensemble donné. Elle
nécessite un tableau des valeurs. Le champ est valide si sa valeur
vérifie l’une des valeurs du tableau donné.
Exemple:
public $validate = array(
'fonction' => array(
'choixAutorise' => array(
'rule' => array('inList', array('Foo', 'Bar')),
'message' => 'Entrez soit Foo, soit Bar.'
)
)
);
La comparaison est non sensible à la casse par défaut. Vous pouvez définir
$caseInsensitive
à true si vous avez besoin d’une comparaison sensible
à la casse.
-
static Validation::ip(string $check, string $type = 'both')
Cette règle s’assurera qu’une adresse IPv4 ou IPv6 valide a été soumise.
Accepte “both” en option (par défaut), “IPv4” ou “IPv6”.
public $validate = array(
'ip_client' => array(
'rule' => array('ip', 'IPv4'), // ou 'IPv6' ou 'both' (par défaut)
'message' => 'Merci de soumettre une adresse IP valide.'
)
);
-
Model::isUnique()
La donnée pour le champ doit être unique, elle ne peut être utilisée par
aucune autre ligne:
public $validate = array(
'login' => array(
'rule' => 'isUnique',
'message' => 'Ce nom d\'user a déjà été choisi.'
)
);
Vous pouvez valider qu’un ensemble de champs sont uniques en fournissant
plusieurs champs et en paramétrant $or
à false
:
public $validate = array(
'email' => array(
'rule' => array('isUnique', array('email', 'username'), false),
'message' => 'Cette combinaise nom & email est déjà utilisée.'
)
);
Assurez-vous d’inclure le champ d’origine dans la liste des champs quand vous
établissez une règle unique sur plusieurs champs.
Si un champ listé n’est pas inclut dans les données du model, il sera alors traité
comme une valeur null. Vous pouvez envisager de marquer les champs répertoriés
comme required
.
-
static Validation::luhn(string|array $check, boolean $deep = false)
L’algorithme Luhn: Une formule de vérification de somme pour valider
un ensemble de nombres d’identification. Regardez
https://en.wikipedia.org/wiki/Luhn_algorithm pour plus d’informations.
-
static Validation::maxLength(string $check, integer $max)
Cette règle s’assure que la donnée respecte la longueur maximale requise:
public $validate = array(
'login' => array(
'rule' => array('maxLength', 15),
'message' => 'Les noms d\'user ne doivent pas dépasser 15 caractères.'
)
);
Ceci va s’assurer que le champ “login” est inférieur ou égal à 15
caractères, et pas à 15 bytes.
-
static Validation::maxLengthBytes(string $check, integer $max)
Cette règle s’assure que la donnée respecte la longueur maximale requise:
public $validate = array(
'data' => array(
'rule' => array('maxLengthBytes', 2 ** 24 - 1),
'message' => 'La donnée ne peut pas faire plus de 16 MB.'
)
);
Ceci va s’assurer que le champ « data » est inférieur ou égal à 16777215 bytes.
-
static Validation::mimeType(mixed $check, array|string $mimeTypes)
Nouveau dans la version 2.2.
Cette règle vérifie la validité d’un mimeType. La comparaison est sensible à
la casse.
Modifié dans la version 2.5.
Depuis 2.5 $mimeTypes
peut être une chaîne regex.
public $validate = array(
'image' => array(
'rule' => array('mimeType', array('image/gif')),
'message' => 'Invalid mime type.'
),
'logo' => array(
'rule' => array('mimeType', '#image/.+#'),
'message' => 'Invalid mime type.'
),
);
-
static Validation::minLength(string $check, integer $min)
Cette règle s’assure que les données aient une longueur minimum:
public $validate = array(
'login' => array(
'rule' => array('minLength', 8),
'message' => 'Usernames must be at least 8 characters long.'
)
);
La longueur ici est le nombre de caractères, et pas le nombre de bytes.
-
static Validation::minLengthBytes(string $check, integer $min)
Cette règle s’assure que les données aient une longueur minimum:
public $validate = array(
'login' => array(
'rule' => array('minLengthBytes', 2 ** 16 - 1),
'message' => 'La donnée ne peut pas faire moins de 64KB.'
)
);
La longueur est ici un nombre de bytes.
-
static Validation::money(string $check, string $symbolPosition = 'left')
Cette règle s’assure que la valeur est une somme monétaire valide.
Le second paramètre définit où le symbole est situé (gauche/droite).
public $validate = array(
'salaire' => array(
'rule' => array('money', 'left'),
'message' => 'Merci de soumettre une somme monétaire valide.'
)
);
-
static Validation::multiple(mixed $check, mixed $options = array(), boolean $caseInsensitive = false)
Utilisez cette règle pour valider un champ select multiple. Elle
accepte les paramètres « in », « max » et « min ».
public $validate = array(
'multiple' => array(
'rule' => array('multiple', array(
'in' => array('do', 'ré', 'mi', 'fa', 'sol', 'la', 'si'),
'min' => 1,
'max' => 3
)),
'message' => 'Merci de choisir une, deux ou trois options'
)
);
La comparaison est sensible à la casse par défaut. Vous pouvez définir
$caseInsensitive
à true si vous avez besoin d’une comparaison insensible
à la casse.
-
static Validation::notEmpty(mixed $check)
Obsolète depuis la version 2.7.
Utilisez notBlank
à la place.
-
static Validation::notBlank(mixed $check)
Nouveau dans la version 2.7.
La règle de base pour s’assurer qu’un champ n’est pas vide.
public $validate = array(
'titre' => array(
'rule' => 'notBlank',
'message' => 'Ce champ ne peut pas rester vide'
)
);
Ne l’utilisez pas pour un champ select multiple, sinon cela causera
une erreur. A la place, utilisez « multiple ».
-
static Validation::numeric(string $check)
Vérifie si la donnée passée est un nombre valide.
public $validate = array(
'cars' => array(
'rule' => 'numeric',
'message' => 'Merci de soumettre le nombre de voitures.'
)
);
-
static Validation::naturalNumber(mixed $check, boolean $allowZero = false)
Nouveau dans la version 2.2.
Cette règle vérifie si une donnée passée est un nombre entier naturel
valide. Si $allowZero
est définie à true, la valeur zero est aussi
acceptée.
public $validate = array(
'wheels' => array(
'rule' => 'naturalNumber',
'message' => 'Merci de fournir le nombre de pneus.'
),
'airbags' => array(
'rule' => array('naturalNumber', true),
'message' => 'Merci de remplir le nombre d'airbags.'
),
);
-
static Validation::phone(mixed $check, string $regex = null, string $country = 'all')
Phone valide les numéros de téléphone US. Si vous voulez valider des
numéros de téléphones non-US, vous pouvez fournir une expression
régulière comme second paramètre pour couvrir des formats de numéros
supplémentaires.
public $validate = array(
'telephone' => array(
'rule' => array('phone', null, 'us')
)
);
-
static Validation::postal(mixed $check, string $regex = null, string $country = 'us')
Postal est utilisé pour valider des codes postaux des U.S.A. (us), du
Canada (ca), du Royaume-Uni (uk), de l’Italie (it), d’Allemagne (de) et
de Belgique (be). Pour les autres formats de codes postaux, vous devez
fournir une expression régulière comme second paramètre.
public $validate = array(
'code_postal' => array(
'rule' => array('postal', null, 'us')
)
);
-
static Validation::range(string $check, integer $lower = null, integer $upper = null)
Cette règle s’assure que la valeur est dans une fourchette donnée. Si
aucune fourchette n’est soumise, la règle s’assurera que la valeur est
un nombre limite valide pour la plateforme courante.
public $validate = array(
'nombre' => array(
'rule' => array('range', -1, 11),
'message' => 'Merci d\'entrer un nombre entre -1 et 11'
)
);
L’exemple ci-dessus acceptera toutes les valeurs qui sont plus grandes que
-1 (par ex, -0.99) et plus petite que 11 (par ex, 10.99).
Note
Les deux extrémités ne sont pas incluses.
-
static Validation::ssn(mixed $check, string $regex = null, string $country = null)
Ssn valide les numéros de sécurité sociale des U.S.A. (us), du Danemark
(dk) et des Pays-Bas (nl). Pour les autres formats de numéros de sécurité
sociale, vous devez fournir une expression régulière.
public $validate = array(
'ssn' => array(
'rule' => array('ssn', null, 'us')
)
);
-
static Validation::time(string $check)
La validation du Time, détermine si une chaîne de caractères est un time
valide. Valide le time en 24hr (HH:MM) ou am/pm ([H]H:MM[a|p]m).
N’autorise/ne valide pas les secondes.
-
static Validation::uploadError(mixed $check)
Nouveau dans la version 2.2.
Cet règle vérifie si un upload de fichier connait une erreur.
public $validate = array(
'image' => array(
'rule' => 'uploadError',
'message' => 'Something went wrong with the upload.'
),
);
-
static Validation::url(string $check, boolean $strict = false)
Cette règle vérifie les formats valides d’URL. Elle supporte les
protocoles http(s), ftp(s), file, news et gopher:
public $validate = array(
'siteweb' => array(
'rule' => 'url'
)
);
Pour s’assurer qu’un protocole est présent dans l’url, le mode strict
peut être activé comme ceci:
public $validate = array(
'siteweb' => array(
'rule' => array('url', true)
)
);
Cette méthode de validation utilise une expression régulière complexe qui
peut parfois entraîner des problèmes avec Apache2 sur Windows en utilisant
mod_php.
-
static Validation::userDefined(mixed $check, object $object, string $method, array $args = null)
Lance une validation de définition d’user.
-
static Validation::uuid(string $check)
Vérifie que la valeur est une valeur UUID valide:
https://tools.ietf.org/html/rfc4122
Validation localisée
Les règles de validation phone() et postal() vont envoyer les
préfixes de pays qu’elles ne savent pas gérer à une autre classe avec le
nom afférant. Par exemple si vous vivez aux Pays-Bas, vous pourriez créer une
classe comme:
class NlValidation {
public static function phone($check) {
// ...
}
public static function postal($check) {
// ...
}
}
Ce fichier pourra être placé dans APP/Validation/
ou
App/PluginName/Validation/
, mais doit être importé via App::uses() avant
tout tentative d’utilisation. Dans votre validation de model, vous pourrez
utiliser votre classe NlValidation en faisant ce qui suit:
public $validate = array(
'phone_no' => array('rule' => array('phone', null, 'nl')),
'postal_code' => array('rule' => array('postal', null, 'nl')),
);
Quand vos données de model sont validées, la Validation va voir qu’elle ne peut
pas gérer la locale nl
et va tenter de déléguer à
NlValidation::postal()
et le retour de cette méthode va être utilisée comme
réussite/echec pour la validation. Cette approche vous permet de créer des
classes qui gèrent un sous-ensemble ou groupe de locales, chose qu’un large
switch ne pourrait pas faire. L’utilisation des méthodes de validation
individuelle n’a pas changé, la possibilité de faire passer à un autre
validateur a été ajouté.
Astuce
Le Plugin Localized contient déjà beaucoup de règles prêtes à être
utilisées: https://github.com/cakephp/localized
Aussi n’hésitez pas à contribuer en donnant vos règles de validation
localisées.