-
Afisare Erori de Validare
-
Mesaje de Eroare Personalizate
-
Exemplu validare upload imagine
-
Reguli de validare valabile
Clasa de baza din Laravel foloseste ValidatesRequests care furnizeaza o metoda
validate() la toate clasele controler pentru a putea defini validari cu o varietate de reguli la cererile HTTP.
De exemplu, puteti valida datele de la campurile unui formular sa aiba un anumit numar minim sau maxim de caractere, sau sa corespunda cu o anumita expresie regulata, ori un fisier incarcat sa aiba dimensiunile intre anumite valori specificate.
Metoda
validate() accepta instanta unei cereri HTTP si un array cu un set de reguli de validare.
- Exemplu, valideaza campurile 'title', 'description' si 'content' inainte de introducere in baza de date:
public function store(Request $request){
$this->validate($request, [
'title'=>'required|unique:table_name|min:3|max:110',
'description'=>'required|max:160',
'content'=>'required',
]);
//The post is valid, store in database...
}
Regulile de mai sus specifica "required" (necesare) pt. toate campurile; "
title" trebuie sa fie unic in tabelul "
table_name" din baza de date (intr-o coloana cu acelasi nume (title)) si sa aiba intre 3 si 110 caractere. Descrierea trebuie sa aiba maxim 160 de caractere.
- Daca datele trimise nu sunt conform regulilor de validare, va fi generat automat un raspuns cu mesaj corespunzator. Daca validarea reuseste, controller-ul va executa codul in continuare.
Oprire la prima regula nevalida
Regulile vor fi validate in ordinea in care au fost alocate.
Pentru a opri rularea verificarii tuturor regulilor pe un atribut dupa prima esuare de validare, adaugati regula
bail la atribut.
- Exemplu, daca regula
required pe atributul
title esuaza, regula
unique nu va fi verificata.
$this->validate($request, [
'title'=>'bail|required|unique:table_name|min:3|max:110',
'description'=>'required|max:160',
'content'=>'required',
]);
Afisare Erori de Validare
Daca datele transmise nu trec regulile de validare, Laravel va redirectiona utilizatorul automat inapoi la locatia anterioara. Si toate erorile de validare vor fi adaugate automat in sesiune, in variabila
$errors.
Pentru apelarile cu AJAX, Laravel genereaza un raspuns JSON care contine toate erorile de validare. Acest raspuns JSON va fi trimis cu un cod status HTTP 422.
Variabila $errors e valabila automat in toate view-urile.
Mesajele de eroare pot fi afisate in template prin adaugarea unui cod ca acesta:
@if($errors->any())
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
Mesaje de Eroare Personalizate
Pentru a personaliza mesajul de eroare, adaugati la metoda
$this->validate() un al treilea argument cu un array cu perechi
attribut /regula si mesajul de eroare corespunzator.
Puteti folosi inlocuitori in mesajele de validare: :attribute (va fi inlocuit cu numele campului pt. validare), :max (Valoare proprietatii max a campului care are aceasta regula), :min, etc.
$rules =[
'title'=>'bail|required|unique:table_name|min:3|max:110',
'description'=>'required|max:160'
];
$messages =[
'required'=> 'Please add a :attribute.',
'title.min'=> 'The title must have at least :min characters.',
'max'=> 'The :attribute must have maximum :max characters.'
];
$this->validate($request, $rules, $messages);
-
O alta metoda de a crea mesaje de eroare personalizate este sa adaugati mesajul in array-ul
custom din fisierul de limbaj:
resources/lang/xx/validation.php.
'custom'=> [
'title'=> [
'required=> 'Please add a title',
'min'=> 'The title must have at least :min characters',
],
],
Preluare Mesaje de Eroare
- Pentru a prelua
primul mesaj de eroare pentru un camp dat, folositi metoda
first('field_name'):
$errors = $validator->errors();
echo $errors->first('email');
- Pentru a prelua
un array cu toate mesajele pentru un camp dat, folositi metoda
get('field_name'):
foreach($errors->get('email') as $msg){
//
}
Pentru a prelua
un array cu toate mesajele din toate campurile, folositi metoda
all():
foreach($errors->all() as $msg){
//
}
Pentru a verifica daca exista mesaj de eroare la un anumit camp, folositi metoda
has('field_name'):
if($errors->has('email')){
//
}
Exemplu validare upload imagine
In acest exemplu vom crea un script de upload imagine cu validare pentru fisierul trimis si campuri 'title' si 'description'.
1. Creati un director "
uploads" in directorul "
public/".
2. Adaugati urmatorul cod pentru controler intr-un fisier "
ValidateUpload.php" (in directorul
app/Http/Controllers/):
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ValidateUpload extends Controller {
protected $dir ='uploads'; //folder for uploaded files (in public/ directory)
//responds to GET /upload
//returns view with upload-form
public function showForm(){
return view('upload_form');
}
//validate the form fields
public function validateForm(Request $request){
//define Rules for validation
$rules =[
'photo'=>'required|mimes:bmp,gif,jpe,jpeg,jpg,png|max:500|dimensions:min_width=80,min_height=80,max_width=800,max_height=800',
'title'=>'required|min:3|max:110',
'description'=>'max:250'
];
//set custom error messages
$msgs =[
'required'=> 'Please add a :attribute',
'max'=> 'The :attribute must have maximum :max characters',
'photo.max'=> 'The image file must have maximum :max KB',
//HERE you can define more custom messages
];
//validate the request
$this->validate($request, $rules, $msgs);
}
//Responds to POST /upload/photo
//receives the $request instance
//return redirect with 'status' string response
public function uploadPhoto(Request $request){
//validate the request
$this->validateForm($request);
$file = $request->file('photo');
//set name and folder on server for uploaded file
$fname = $file->getClientOriginalName();
$fmoved = $file->move(base_path() .'/public/'. $this->dir, $fname);
//if successfully moved in uploads directory
if($fmoved){
$resp ='<h4>File successfully uploaded:</h4>'. $this->dir .'/'. $fname .'<br><img src="/'. $this->dir .'/'. $fname .'" alt="Photo" /><br>- Title: '. $request->title .'<br>-Description: '. $request->description;
}
else $resp ='Unable to move the file to: '. $this->dir .'/'. $fname;
return redirect()->route('upload')->with('status', $resp);
}
}
- Campurile 'photo' si 'title' sunt necesare. Fisierul incarcat trebuie sa fie o imagine cu marimea maxima de 500 KB si dimensiunile inaltimii si lungimii intre 80 si 800 pixeli.
- Titlul trebuie sa aiba minim 3 si maxim 110 caractere.
3. Adaugati urmatorul cod intr-un fisierul view: "
upload_form.blade.php" (in directorul "
resources/views/"):
@if($errors->any())
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
@if(session('status'))
<blockquote>
{!! session('status') !!}
</blockquote>
@endif
<h3>Upload Photo</h3>
<form method='post' action='/upload/photo' enctype='multipart/form-data'>
{{ csrf_field() }}
<p>File: <input type='file' name='photo'/></p>
<p>Title: <input type='text' name='title'/></p>
<p>Description: <input type='text' name='description'/></p>
<input type='submit' value='Upload'/>
</form>
4. Pentru definirea Rutelor de accesare, adaugati acest cod in fisierul "
routes/web.php":
//shows the upload form
Route::name('upload')->get('/upload', 'ValidateUpload@showForm');
//when the upload form is submited
Route::post('/upload/photo', 'ValidateUpload@uploadPhoto');
5. Accesati in browser urmatoarea adresa URL:
//localhost:8000/upload
- Va afisa o pagina ca in aceasta imagine:
6. Apasati pe butonul Upload, fara a selecta un fisier sau a introduce ceva in campurile de text. Rezultatul va apare ca in urmatoarea imagine:
Reguli de validare valabile
Mai jos e o lista cu regulile de validare valabile si functiile lor.
accepted
Campul verificat trebuie sa fie
yes,
on,
1, sau
true.
'agree'=> 'accepted'
active_url
Campul verificat trebuie sa contina o adresa DNS 'hostname' valida conform functiei PHP
dns_get_record()
.
'url'=> 'active_url'
after:date
Campul verificat trebuie sa fie o valoare cu o data calendaristica care sa urmeze dupa regula specificata. Regula sa corespunda pt. functia PHP
strtotime()
:
'start_date'=> 'required|date|after:tomorrow'
In loc de a adauga un sir pt. data care sa fie evaluat de
strtotime()
, puteti specifica un alt camp cu o data calendaristica care sa fie comparat cu data transmisa:
'finish_date'=> 'required|date|after:start_date'
after_or_equal:date
Campul verificat trebuie sa fie o o data calendaristica dupa sau egala cu data specificata.
'start_date'=> 'required|date|after_or_equal:yesterday'
alpha
Campul verificat trebuie sa contina doar caractere alfabetice.
'field_name'=> 'alpha'
alpha_dash
Campul verificat poate avea caractere alfa-numerice si liniute.
'field_name'=> 'alpha_dash'
alpha_num
Campul verificat trebuie sa contina doar caractere alfa-numerice.
'field_name'=> 'alpha_num'
array
Campul verificat trebuie sa fie un
array
PHP.
'field_name'=> 'array'
before:date
Campul verificat trebuie sa fie o valoare care precede regula specificata. Regula sa corespunda pt. functia PHP
strtotime()
:
'start_date'=> 'required|date|before:yesterday'
before_or_equal:date
Campul verificat trebuie sa fie o valoare care precede sau este egala cu regula specificata.
'start_date'=> 'required|date|before_or_equal:yesterday'
'finish_date'=> 'required|date|before_or_equal:start_date'
between:min,max
Campul verificat trebuie sa aiba o marime intre valoarile
min si
max. Sirurile, numererele, array-uri, si fisierele sunt evaluate ca si la regula
size
.
'title'=> 'required|between:3,110' //string between 3 and 110 characters
'number'=> 'between:10,40' //a number between 10 and 40
'file'=> 'between:1,500' //file between 1 and 500 KB
boolean
Campul verificat trebuie sa fie:
true
,
false
,
1
,
0
,
"1"
, sau
"0"
.
'field_name'=> 'boolean'
confirmed
Campul verificat trebuie sa aibe un camp de potrivire '
..._confirmation
'. De exemplu, daca pt. verificare e un camp
password
, un alt camp
password_confirmation
trebuie sa fie prezent in campurile trimise.
'password'=> 'confirmed'
date
Campul verificat trebuie sa fie o data valida conform functiei PHP
strtotime()
.
'start_date'=> 'date'
Campul verificat trebuie sa se potriveasca cu
formatul specificat. Folositi
ori date
ori
date_format
cand validati un camp de data calendaristica, nu amandoua.
'end_date'=> 'Y-n-j' //2017-8-15
different:field
Campul verificat trebuie sa aiba o valoare diferita fata de
field.
'field_name'=> 'different:other_field'
digits:value
Campul verificat trebuie sa fie
numeric si sa aiba un numar exacta de caractere.
'number'=> 'digits:3' //789
digits_between:min,max
Campul verificat trebuie sa fie un numar intre un
min si
max de caractere.
'number'=> 'digits_between:2,4' //23, 456, 7890
dimensions
Fisierul verificat trebuie sa fie o imagine, cu dimensiunile specificate de parametri regulii:
'avatar' => 'dimensions:min_width=100,min_height=200'
Parametri valabili sunt:
min_width,
max_width,
min_height,
max_height,
width,
height,
ratio.
- Puteti specifica si un raport (
ratio) intre inaltime si lungime; printr-o afirmatie ca
3/2
sau un numar cu sub-unitati
1.5
:
'avatar' => 'dimensions:ratio=3/2'
Deoarece aceasta regula are mai multe argumente, puteti folosi metoda
Rule::dimensions
pentru a construi regula intr-un mod fluent:
use Illuminate\Validation\Rule;
//$data is the $request
Validator::make($data, [
'avatar' => [
'required',
Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2),
]
]);
distinct
Cand lucrari cu array-uri, campul verificat trebuie sa nu aibe valori duplicate.
'foo.*.id' => 'distinct'
email
Campul verificat trebuie sa contina o adresa de email.
'email'=> 'email'
exists:table,column
Campul verificat trebuie sa existe intr-un tabel specificat din baza de date.
'state'=> 'exists:states'
- Puteti specifica un nume de coloana:
'state'=> 'exists:table_name,column_name'
Pentru a folosi o conexiune specifica de baza de date pentru interogarea
exists
, adaugati numele conexiunii inainte de numele tabelului, separate prin punct "dot":
'email' => 'exists:conn_name.staff,email'
file
Campul verificat trebuie sa contina un fisier transmis cu succes.
'photo'=> 'file'
filled
Campul verificat nu trebuie sa fie gol.
'title'=> 'filled'
image
Campul verificat trebie sa contina un fisier cu o imagine (jpeg, png, bmp, gif, sau svg).
'photo'=> 'image'
in:foo,bar,...
Valoarea din campul verificat trebuie sa fie intr-o lista de valori.
'zones'=> 'required|in:first-zone,second-zone'
Deoarece acesta regula de obicei se foloseste cu un array de valori si
implode()
, metoda
Rule::in
poate fi folosita pentru a construi fluent regula:
use Illuminate\Validation\Rule;
//$data is the $request
Validator::make($data, [
'zones' => [
'required',
Rule::in(['first-zone', 'second-zone']),
]
]);
in_array:anotherfield
Campul verificat trebuie sa exista in valorile dintr-un
another_field, tip array.
'field_name'=> 'in_array:another_field'
integer
Campul verificat trebuie sa fie un numar intreg.
'day'=> 'integer'
ip
Campul verificat trebuie sa fie o adresa IP.
ipv4
Campul verificat trebuie sa fie o adresa IPv4.
ipv6
Campul verificat trebuie sa fie o adresa IPv6.
'ip'=> 'ip'
'ip'=> 'ipv4'
'ip'=> 'ipv6'
json
Campul verificat trebuie sa fie un sir JSON.
'field_name'=> 'json'
max:value
Valoarea din campul verificat trebuie sa fie mai mic sau egal cu o
valoare maxima. Sirurile, numererele, array-uri, si fisierele sunt evaluate ca si la regula
size
.
'title'=> 'max:110' //string with maximum 110 characters
'number'=> 'max:40' //a maximum number of 40
'file'=> 'max:500' //maximum file size 500 KB
mimetypes:text/plain,...
Fisierul verificat trebuie sa se potriveasca cu unul din tipurile MIME date::
'video'=> 'mimetypes:video/avi,video/mpeg,video/quicktime'
Pentru a determina tipul MIME a fisierului incarcat, continutul fisierului va fi citit si framework-ul va incerca sa ghiceasca tipul de MIME, care poate fi diferit de tipul MIME furnizat de client..
mimes:foo,bar,...
Fisierul verificat trebuie sa aibe tipul de MIME corespunzator cu unul din extensiile listate.
'photo'=> 'mimes:jpeg,bmp,png'
Cu toate ca trebuie doar sa specificati extensiile, aceasta regula defapt valideaza prin tipul de MIME al fisierului; framework-ul citeste continutului fisierului si foloseste o extensie dupa tipul de MIME identificat.
- O lista intrega cu tipurile de MIME si extensiile corespunzatoare poate fi gasita la aceasta adresa:
//svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
min:value
Valoarea din campul verificat sa fie mai mare sau egala cu o
valoare specificata. Sirurile, numererele, array-uri, si fisierele sunt evaluate ca si la regula
size
.
'title'=> 'min:110' //string with minimum 110 characters
'number'=> 'min:40' //a minimum number of 40
'file'=> 'min:20' //minimum file size 20 KB
nullable
Campul verificat poate fi
null
. Este folositor cand validati siruri si numere intregi care contin valori
nule
.
'field_name'=> 'nullable'
not_in:foo,bar,...
Campul verificat trebuie sa nu fie inclus intr-o lista data de valori.
'field_name'=> 'not_in:abc,xyz'
numeric
Campul verificat trebuie sa contina numar.
'number'=> 'numeric'
present
Campul verificat trebuie sa fie in datele transmise, dar poate fi si gol.
'description'=> 'present'
regex:pattern
Campul verificat trebuie sa se potriveasca cu o anumita expresie requlata.
'field_name'=> 'regex:(^[A-z]+-[0-9]+$)' //Abc-123
required
Campul verificat trebuie sa fie prezent in datele transmise, si sa nu fie gol.
'title'=> 'required'
- Un camp este considerat "gol" in una din urmatoarele conditii:
- Valoarea este
null
.
- Valoarea este un sir gol.
- Valoarea este un array gol sau un obiect
Countable
gol.
- Un camp 'file' fara fisier incarcat.
required_if:anotherfield,value,...
Campul verificat trebuie sa fie prezent si sa nu fie gol, daca campul
another_field are una din
valoarile specificate.
'description'=> 'required_if:another_field,val_1,val_2'
required_unless:anotherfield,value,...
Campul verificat trebuie sa fie prezent si sa nu fie gol, afara de cazul cand campul
another_field este egal cu un din
valoarile listate.
'description'=> 'required_unless:title,val_1,val_2'
required_with:foo,bar,...
Campul verificat trebuie sa fie prezent si sa nu fie gol daca unul din celelalte campuri specificate e prezent.
'field_name'=> 'required_with:other_field,another_field'
required_with_all:foo,bar,...
Campul verificat trebuie sa fie prezent si sa nu fie gol, daca toate celelalte campuri specificate sunt prezente.
'field_name'=> 'required_with_all:other_field,another_field'
required_without:foo,bar,...
Campul verificat trebuie sa fie prezent si sa nu fie gol, daca vreunul din celelalte campuri nu e prezent.
'field_name'=> 'required_without:other_field,another_field'
required_without_all:foo,bar,...
Campul verificat trebuie sa fie prezent si sa nu fie gold, daca toate celelalte campuri specificate nu sunt prezente.
'field_name'=> 'required_without_all:other_field,another_field'
same:field
Valoarea din campul verificat sa fie aceeasi cu cea din "
other_field".
'field_name'=> 'same:other_field'
size:value
Campul verificat trebuie sa aiba o marime potrivit valorii specificate.
- Pentru siruri,
value corespunde cu numarul de caractere.
- Pentru numere,
value corespunde cu numarul specificat.
- Pentru un array,
size corespunde cu numarul de elemente (
count()
) din array.
- Pentru fisiere,
size corespunde cu
marimea fisierului in kilobytes.
'code'=> 'size:8' //string with 8 characters
'number'=> 'size:40' //the number 40
'file'=> 'size:20' //file size 20 KB
string
Campul verificat trebuie sa fie un sir
- Daca vreti sa permite campului sa poata fi si
null
, atribuiti si regula
nullable
.
'field_name'=> 'string|nullable'
timezone
Campul verificat trebuie sa fie un identificator de fus orar valid conform functiei PHP
timezone_identifiers_list()
.
'zone'=> 'timezone' //Europe/London
unique:table,column,except_id,id_column
Campul verificat trebuie sa unic intr-un tabel din baza de date. Daca optionea
column
nu este specificata, este folosit numele campului.
'email' => 'unique:users,email_address'
- Cu o anumita conexiune la Baza de date:
'email' => 'unique:conn_name.users,email_address'
Pentru ca regula unique sa ignore un ID specificat, puteti adauga ID-ul ca al treilea parametru:
'email' => 'unique:users,email_address,'.$id
- Daca tabelul foloseste o coloana de tip
primary key cu alt nume decat
id, pentru a-l ignora, specificati numele ca
al patrulea parametru:
'email' => 'unique:users,email_address,'.$id.',id_col'
• Sau cu clasa Rule:
use Illuminate\Validation\Rule;
//$data is the $request
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($id, 'id_col')
]
]);
• Puteti sa folositi clasa Rule pentru a adauga la interogare parametri aditionali
where():
use Illuminate\Validation\Rule;
//$data is the $request
Validator::make($data, [
'email'=>[
'required',
'email'=> Rule::unique('users')->where(function($query){
$query->where('account_id', 1);
})
]
]);
- In regula de mai sus, doar randurile care au valoarea 1 la
account_id vor fi incluse in verificarea unique.
url
Campul verificat trebuie sa fie o adresa URL.
'link'=> 'url'
- Documentatie:
Laravel - Validation