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 |
|---|---|
required | Câmpul trebuie să existe și să nu fie gol |
nullable | Câmpul poate lipsi sau fi gol — restul regulilor se aplică doar dacă e prezent |
optional | Câ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 |
|---|---|
trim | Elimină spațiile de la început și sfârșit |
int / integer | Conversie la int |
float | Conversie la float |
decimal | Conversie la BcMath\Number |
bool / boolean | Conversie la bool |
date | Conversie la DateTimeImmutable |
array | Conversie la array |
null_on_empty | Transformă string gol în null |
default:valoare | Valoare implicită dacă lipsește |
phone:RO | Parsează număr de telefon (cod țară opțional) |
url | Parsează și normalizează URL |
email | Parsează email (extrage doar adresa) |
ipv4 | Asigură format IPv4 |
ipv6 | Asigură format IPv6 |
nin | Parsează 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 |
|---|---|
email | Validează format email |
numeric | Verifică să fie numeric |
not_empty | Nu poate fi gol |
max:100 | Lungime maximă (string) sau valoare maximă (numeric) |
min:3 | Lungime minimă (string) sau valoare minimă (numeric) |
size:10 | Lungime exactă |
enum:val1,val2,val3 | Valoarea 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',
]);