Validateur
Il existe de nombreux validateurs disponibles avec composer, par exemple :
top-think/think-validate
respect/validation
Validateur top-think/think-validate
Description
Validateur officiel de ThinkPHP
Adresse du projet
https://github.com/top-think/think-validate
Installation
composer require topthink/think-validate
Démarrage rapide
Créer app/index/validate/User.php
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
protected $message = [
'name.require' => 'Le nom est requis',
'name.max' => 'Le nom ne peut pas dépasser 25 caractères',
'age.number' => 'L\'âge doit être un nombre',
'age.between' => 'L\'âge doit être compris entre 1 et 120',
'email' => 'Format de l\'email incorrect',
];
}
Utilisation
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$validate = new \app\index\validate\User;
if (!$validate->check($data)) {
var_dump($validate->getError());
}
Attention
LeValidate::rule()
de think-validate n'est pas supporté dans webman
Validateur workerman/validation
Description
Ce projet est une version localisée de https://github.com/Respect/Validation
Adresse du projet
https://github.com/walkor/validation
Installation
composer require workerman/validation
Démarrage rapide
<?php
namespace app\controller;
use support\Request;
use Respect\Validation\Validator as v;
use support\Db;
class IndexController
{
public function index(Request $request)
{
$data = v::input($request->post(), [
'nickname' => v::length(1, 64)->setName('Surnom'),
'username' => v::alnum()->length(5, 64)->setName('Nom d’utilisateur'),
'password' => v::length(5, 64)->setName('Mot de passe')
]);
Db::table('user')->insert($data);
return json(['code' => 0, 'msg' => 'ok']);
}
}
Accès via jQuery
$.ajax({
url : 'http://127.0.0.1:8787',
type : "post",
dataType:'json',
data : {nickname:'Tom', username:'tom cat', password: '123456'}
});
Résultat obtenu :
{"code":500,"msg":"Le nom d'utilisateur ne peut contenir que des lettres (a-z) et des chiffres (0-9)"}
Description :
v::input(array $input, array $rules)
est utilisé pour valider et collecter des données, si la validation des données échoue, une exception Respect\Validation\Exceptions\ValidationException
est lancée, si la validation réussit, les données validées (tableau) sont retournées.
Si le code métier n'attrape pas l'exception de validation, le framework webman l'attrapera automatiquement et retournera des données JSON en fonction de l'en-tête de la requête HTTP (similaire à {"code":500, "msg":"xxx"}
) ou une page d'exception ordinaire. Si le format de retour ne correspond pas aux besoins du métier, le développeur peut attraper l'exception ValidationException
et retourner les données nécessaires, comme dans l'exemple ci-dessous :
<?php
namespace app\controller;
use support\Request;
use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\ValidationException;
class IndexController
{
public function index(Request $request)
{
try {
$data = v::input($request->post(), [
'username' => v::alnum()->length(5, 64)->setName('Nom d’utilisateur'),
'password' => v::length(5, 64)->setName('Mot de passe')
]);
} catch (ValidationException $e) {
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);
}
}
Guide des fonctionnalités de Validator
use Respect\Validation\Validator as v;
// Validation d'une seule règle
$number = 123;
v::numericVal()->validate($number); // true
// Validation en chaîne avec plusieurs règles
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true
// Obtenir la première raison d'échec de la vérification
try {
$usernameValidator->setName('Nom d’utilisateur')->check('alg anet');
} catch (ValidationException $exception) {
echo $exception->getMessage(); // Le nom d’utilisateur ne peut contenir que des lettres (a-z) et des chiffres (0-9)
}
// Obtenir toutes les raisons d'échec de la vérification
try {
$usernameValidator->setName('Nom d’utilisateur')->assert('alg anet');
} catch (ValidationException $exception) {
echo $exception->getFullMessage();
// Cela affichera :
// - Le nom d’utilisateur doit satisfaire aux règles suivantes
// - Le nom d’utilisateur ne peut contenir que des lettres (a-z) et des chiffres (0-9)
// - Le nom d’utilisateur ne peut pas contenir d'espaces
var_export($exception->getMessages());
// Cela affichera :
// array (
// 'alnum' => 'Le nom d’utilisateur ne peut contenir que des lettres (a-z) et des chiffres (0-9)',
// 'noWhitespace' => 'Le nom d’utilisateur ne peut pas contenir d'espaces',
// )
}
// Message d'erreur personnalisé
try {
$usernameValidator->setName('Nom d’utilisateur')->assert('alg anet');
} catch (ValidationException $exception) {
var_export($exception->getMessages([
'alnum' => 'Le nom d’utilisateur ne peut contenir que des lettres et des chiffres',
'noWhitespace' => 'Le nom d’utilisateur ne peut pas avoir d'espaces',
'length' => 'La longueur respecte les règles donc cela ne s'affichera pas'
]));
// Cela affichera
// array(
// 'alnum' => 'Le nom d’utilisateur ne peut contenir que des lettres et des chiffres',
// 'noWhitespace' => 'Le nom d’utilisateur ne peut pas avoir d'espaces'
// )
}
// Vérification d'un objet
$user = new stdClass;
$user->name = 'Alexandre';
$user->birthdate = '1987-07-01';
$userValidator = v::attribute('name', v::stringType()->length(1, 32))
->attribute('birthdate', v::date()->minAge(18));
$userValidator->validate($user); // true
// Vérification d'un tableau
$data = [
'parentKey' => [
'field1' => 'value1',
'field2' => 'value2',
'field3' => true,
]
];
v::key(
'parentKey',
v::key('field1', v::stringType())
->key('field2', v::stringType())
->key('field3', v::boolType())
)
->assert($data); // peut aussi utiliser check() ou validate()
// Validation optionnelle
v::alpha()->validate(''); // false
v::alpha()->validate(null); // false
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true
// Règles de négation
v::not(v::intVal())->validate(10); // false
Différences entre les trois méthodes validate()
, check()
et assert()
validate()
retourne un booléen et ne lancera pas d'exception
check()
lancera une exception en cas d'échec de la validation, avec la première raison d'échec accessible via $exception->getMessage()
assert()
lancera une exception en cas d'échec de la validation, avec toutes les raisons d'échec accessibles via $exception->getFullMessage()
Liste des règles de validation couramment utilisées
Alnum()
n'inclut que des lettres et des chiffres
Alpha()
n'inclut que des lettres
ArrayType()
type tableau
Between(mixed $minimum, mixed $maximum)
vérifie si l'entrée se trouve entre deux valeurs
BoolType()
vérifie si c'est de type booléen
Contains(mixed $expectedValue)
vérifie si l'entrée contient certaines valeurs
ContainsAny(array $needles)
vérifie si l'entrée contient au moins une des valeurs définies
Digit()
vérifie si l'entrée ne contient que des chiffres
Domain()
vérifie si c'est un nom de domaine valide
Email()
vérifie si c'est une adresse email valide
Extension(string $extension)
vérifie l'extension
FloatType()
vérifie si c'est de type flottant
IntType()
vérifie si c'est un entier
Ip()
vérifie si c'est une adresse IP
Json()
vérifie si c'est des données JSON
Length(int $min, int $max)
vérifie si la longueur se situe dans une plage donnée
LessThan(mixed $compareTo)
vérifie si la longueur est inférieure à une valeur donnée
Lowercase()
vérifie si ce sont des lettres minuscules
MacAddress()
vérifie si c'est une adresse MAC
NotEmpty()
vérifie si ce n'est pas vide
NullType()
vérifie si c'est null
Number()
vérifie si c'est un nombre
ObjectType()
vérifie si c'est un objet
StringType()
vérifie si c'est de type chaîne
Url()
vérifie si c'est une URL
Pour plus de règles de validation, voir https://respect-validation.readthedocs.io/en/2.0/list-of-rules/