Validatore

composer ha molti validatori che possono essere usati direttamente, ad esempio:

top-think/think-validate

respect/validation

Validatore top-think/think-validate

Descrizione

Validator ufficiale di ThinkPHP

Indirizzo del progetto

https://github.com/top-think/think-validate

Installazione

composer require topthink/think-validate

Introduzione rapida

Crea 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' => 'Il nome è obbligatorio',
        'name.max'     => 'Il nome non può superare i 25 caratteri',
        'age.number'   => 'L\'età deve essere un numero',
        'age.between'  => 'L\'età deve essere compresa tra 1 e 120',
        'email'        => 'Formato email non valido',    
    ];

}

Utilizzo

$data = [
    'name'  => 'thinkphp',
    'email' => 'thinkphp@qq.com',
];

$validate = new \app\index\validate\User;

if (!$validate->check($data)) {
    var_dump($validate->getError());
}

Nota
webman non supporta il metodo Validate::rule() di think-validate

Validatore workerman/validation

Descrizione

Progetto in versione localizzata di https://github.com/Respect/Validation

Indirizzo del progetto

https://github.com/walkor/validation

Installazione

composer require workerman/validation

Introduzione rapida

<?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('Nickname'),
            'username' => v::alnum()->length(5, 64)->setName('Nome utente'),
            'password' => v::length(5, 64)->setName('Password')
        ]);
        Db::table('user')->insert($data);
        return json(['code' => 0, 'msg' => 'ok']);
    }
}  

Accesso tramite jQuery

  $.ajax({
      url : 'http://127.0.0.1:8787',
      type : "post",
      dataType:'json',
      data : {nickname:'Tom', username:'tom cat', password: '123456'}
  });

Risultato ottenuto:

{"code":500,"msg":"Il nome utente può contenere solo lettere (a-z) e numeri (0-9)"}

Spiegazione:

v::input(array $input, array $rules) viene utilizzato per convalidare e raccogliere i dati; se la validazione dei dati fallisce, verrà sollevata l'eccezione Respect\Validation\Exceptions\ValidationException; se la validazione ha esito positivo, verranno restituiti i dati convalidati (array).

Se il codice aziendale non gestisce l'eccezione di validazione, il framework webman la gestirà automaticamente e, in base all'intestazione della richiesta HTTP, restituirà dati JSON (simili a {"code":500, "msg":"xxx"}) o una normale pagina di eccezione. Se il formato di ritorno non soddisfa le esigenze aziendali, gli sviluppatori possono gestire manualmente l'eccezione ValidationException e restituire i dati richiesti, simile all'esempio qui sotto:

<?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('Nome utente'),
                'password' => v::length(5, 64)->setName('Password')
            ]);
        } catch (ValidationException $e) {
            return json(['code' => 500, 'msg' => $e->getMessage()]);
        }
        return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);
    }
}

Guida alle funzionalità di Validator

use Respect\Validation\Validator as v;

// Validazione di una singola regola
$number = 123;
v::numericVal()->validate($number); // true

// Validazione di più regole in modo concatenato
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true

// Ottenere la prima motivazione di fallimento della validazione
try {
    $usernameValidator->setName('Nome utente')->check('alg  anet');
} catch (ValidationException $exception) {
    echo $exception->getMessage(); // Il nome utente può contenere solo lettere (a-z) e numeri (0-9)
}

// Ottenere tutte le motivazioni di fallimento della validazione
try {
    $usernameValidator->setName('Nome utente')->assert('alg  anet');
} catch (ValidationException $exception) {
    echo $exception->getFullMessage();
    // Verrà stampato
    // -  Il nome utente deve soddisfare le seguenti regole
    //     - Il nome utente può contenere solo lettere (a-z) e numeri (0-9)
    //     - Il nome utente non può contenere spazi

    var_export($exception->getMessages());
    // Verrà stampato
    // array (
    //   'alnum' => 'Il nome utente può contenere solo lettere (a-z) e numeri (0-9)',
    //   'noWhitespace' => 'Il nome utente non può contenere spazi',
    // )
}

// Messaggi di errore personalizzati
try {
    $usernameValidator->setName('Nome utente')->assert('alg  anet');
} catch (ValidationException $exception) {
    var_export($exception->getMessages([
        'alnum' => 'Il nome utente può contenere solo lettere e numeri',
        'noWhitespace' => 'Il nome utente non può contenere spazi',
        'length' => 'length è conforme alle regole, quindi questo non verrà visualizzato'
    ]));
    // Verrà stampato 
    // array(
    //    'alnum' => 'Il nome utente può contenere solo lettere e numeri',
    //    'noWhitespace' => 'Il nome utente non può contenere spazi'
    // )
}

// Validazione di un oggetto
$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

// Validazione di un array
$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); // puoi anche usare check() o validate()

// Validazione opzionale
v::alpha()->validate(''); // false 
v::alpha()->validate(null); // false 
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true

// Regole di negazione
v::not(v::intVal())->validate(10); // false

Differenze tra i tre metodi di Validator validate(), check(), assert()

validate() restituisce un valore booleano, non solleverà eccezioni

check() solleverà eccezioni in caso di fallimento della validazione, usando $exception->getMessage() per ottenere la prima motivazione di fallimento

assert() solleverà eccezioni in caso di fallimento della validazione, usando $exception->getFullMessage() per ottenere tutte le motivazioni di fallimento della validazione

Elenco delle regole di validazione comuni

Alnum() contiene solo lettere e numeri

Alpha() contiene solo lettere

ArrayType() tipo array

Between(mixed $minimum, mixed $maximum) verifica se l'input è compreso tra altri due valori.

BoolType() verifica se è di tipo booleano

Contains(mixed $expectedValue) verifica se l'input contiene determinati valori

ContainsAny(array $needles) verifica se l'input contiene almeno un valore definito

Digit() verifica se l'input contiene solo numeri

Domain() verifica se è un dominio valido

Email() verifica se è un indirizzo email valido

Extension(string $extension) verifica l'estensione

FloatType() verifica se è di tipo float

IntType() verifica se è un intero

Ip() verifica se è un indirizzo IP

Json() verifica se è un dato JSON

Length(int $min, int $max) verifica se la lunghezza è nell'intervallo fornito

LessThan(mixed $compareTo) verifica se la lunghezza è minore di un valore fornito

Lowercase() verifica se è una lettera minuscola

MacAddress() verifica se è un indirizzo MAC

NotEmpty() verifica se non è vuoto

NullType() verifica se è null

Number() verifica se è un numero

ObjectType() verifica se è un oggetto

StringType() verifica se è di tipo stringa

Url() verifica se è un URL

Per ulteriori regole di validazione, visita https://respect-validation.readthedocs.io/en/2.0/list-of-rules/

Ulteriori informazioni

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