Salt la conținut

Validare

Sistemul de validare din Leto este bazat pe reguli declarate ca string-uri, similar cu Laravel. Clasa principală este Leto\Data\Validation\Validator.

Utilizare de bază

use Leto\Data\Validation\Validator;

$data = Validator::validate($_POST, [
    'name' => 'required|trim',
    'email' => 'required|email',
    'age' => 'int|default:18',
]);

Metoda validate() returnează array-ul cu datele validate și modificate. Dacă validarea eșuează, aruncă ValidationFailedException.

Din GET și POST

// Date din query string
$filters = Validator::validateGet([
    'p' => 'int|default:1',
    'rpp' => 'int|default:50',
    'search' => 'nullable|trim',
]);

// Date din formular
$data = Validator::validatePost([
    'name' => 'required|trim',
    'email' => 'required|email',
]);

Reguli de existență

Controlează dacă un câmp trebuie validat sau poate fi omis:

RegulăEfect
requiredCâmpul trebuie să existe și să nu fie gol
nullableCâmpul poate lipsi sau fi gol — restul regulilor se aplică doar dacă e prezent
optionalCâmpul poate lipsi complet; dacă e prezent, se aplică restul regulilor
Validator::validate($data, [
    'name' => 'required',
    'bio' => 'nullable|max:500',
    'avatar' => 'optional|url',
]);

Reguli de modificare

Modifică valoarea înainte de validare. Se aplică în ordinea în care sunt declarate:

RegulăEfect
trimElimină spațiile de la început și sfârșit
int / integerConversie la int
floatConversie la float
decimalConversie la BcMath\Number
bool / booleanConversie la bool
dateConversie la DateTimeImmutable
arrayConversie la array
null_on_emptyTransformă string gol în null
default:valoareValoare implicită dacă lipsește
phone:ROParsează număr de telefon (cod țară opțional)
urlParsează și normalizează URL
emailParsează email (extrage doar adresa)
ipv4Asigură format IPv4
ipv6Asigură format IPv6
ninParsează CNP și extrage informații
$data = Validator::validate($_POST, [
    'age' => 'int|default:0',
    'price' => 'decimal',
    'bio' => 'nullable|null_on_empty|trim',
    'phone' => 'nullable|phone:RO',
    'active' => 'bool',
]);

Reguli de validare

Verifică valoarea după ce s-au aplicat modificatorii:

RegulăEfect
emailValidează format email
numericVerifică să fie numeric
not_emptyNu poate fi gol
max:100Lungime maximă (string) sau valoare maximă (numeric)
min:3Lungime minimă (string) sau valoare minimă (numeric)
size:10Lungime exactă
enum:val1,val2,val3Valoarea trebuie să fie una din lista dată
Validator::validate($data, [
    'username' => 'required|trim|min:3|max:50',
    'email' => 'required|email',
    'score' => 'int|min:0|max:100',
    'status' => 'required|enum:active,inactive,banned',
]);

Gestionarea erorilor

use Leto\Data\Validation\Exceptions\ValidationFailedException;

try {
    $data = Validator::validate($_POST, [
        'email' => 'required|email',
        'name' => 'required|min:3',
    ]);
} catch (ValidationFailedException $e) {
    $errors = $e->getErrors();  // ['email' => ['...'], 'name' => ['...']]
}

Exemplu real: filtrare cu paginare

$data = Validator::validateGet([
    'rpp' => 'int|default:50',
    'p' => 'int|default:1',
]);

$jobs = JobModel::all()
    ->orderBy('id', Order::DESC)
    ->paginate($data['p'], $data['rpp'], $paginationInfo);

Exemplu real: login cu stare din sesiune

$data = Validator::validate($_SESSION['auth'] ?? [], [
    'redirectURL' => 'nullable|null_on_empty|url',
    'activeProvider' => 'nullable|null_on_empty|int',
    'identifiedUser' => 'nullable|null_on_empty|int',
]);