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
Le Validate::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/

Plus de contenu

Visitez https://respect-validation.readthedocs.io/en/2.0/