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 metodoValidate::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/