- 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:
laravel upload form

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:
laravel validate upload

Reguli de validare valabile

Mai jos e o lista cu regulile de validare valabile si functiile lor.
Accepted Active URL After (Date) After Or Equal (Date) Alpha Alpha Dash Alpha Numeric Array Before (Date) Before Or Equal (Date) Between Boolean Confirmed Date Date Format Different Digits Digits Between Dimensions (Image Files) Distinct E-Mail Exists (Database) File Filled Image (File) In In Array Integer IP Address JSON Max MIME Types MIME Type By File Extension Min Nullable Not In Numeric Present Regular Expression Required Required If Required Unless Required With Required With All Required Without Required Without All Same Size String Timezone Unique (Database) URL

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'

date_format:format

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:

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

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Care tag se foloseste in <table> pentru a crea celula de tip "header"?
<thead> <th> <td>
<table><tr>
  <th>Title 1</th>
  <th>Title 2</th>
</tr></table>
Ce proprietate CSS seteaza distanta dintre randuri?
line-height word-spacing margin
.some_class {
  line-height: 150%;
}
Care functie deschide o noua fereastra.
alert() confirm() open()
document.getElementById("id_button").onclick = function(){
  window.open("http://coursesweb.net/");
}
Indicati functia PHP care returneaza un array cu numele fisierelor si directoarelor dintr-un director.
mkdir() scandir() readdir()
$ar_dir = scandir("dir_name");
var_export($ar_dir);
Care din urmatoarele forme a verbului "sleep" (a dormi) se foloseste pentru viitor?
sleeping slept will sleep
He will sleep there.
- El va dormi acolo.
Care din urmatoarele forme a verbului "dormir" (a dormi) se foloseste pentru viitor?
dormido dormirá durmiendo
Él dormirá allí.
- El va dormi acolo.
Laravel tutorial - Validare

Last accessed pages

  1. Data si Timp - Obiect Date (2)
  2. Incarcare imagini pe server si afisare cu Ajax (6)
  3. Curs si Tutoriale Ajax (66)
  4. Bubbles3 (3489)
  5. Prezentul simplu - Exercitii si teste incepatori (758)

Popular pages this month

  1. Bubbles3 (3489)
  2. Gramatica limbii engleze - Prezentare Generala (2797)
  3. Prezentul simplu si continuu - Present Tense Simple and Continuous (2526)
  4. Butterfly Kyodai (2204)
  5. Zuma Deluxe (2083)