Laravel validacija request-a
Kako validairati request u kontroleru i kako izbeći pucanje aplikacije ako korisnik pretražuje na primer post koji ne postoji u bazi a mi ne proverimo pre toga njegovo postojanje.
Kao prvo i osnovno objanićemo kako izbeći da sajt ne pukne ako ne postoji nešto u bazi što je korisnik zahtevao. Na primer ako korisnik proba da vidi na našem sajtu dal postoji članak o CSS-u direktno kroz url, to bi ovako izgledalo: https://www.tvojsajt.rs/blog/css .
Pošto mi nemamo članak o CSS-u, a koristili smo laravel metodu ->first() kako bi poslali zahtev u bazu podataka, laravel bi vratio null i sajt bi automatski pukao kad bi pokušali da prikažemo taj članak na sajtu. Zato je neophodno kod ovakvih slučajeva korsititi metodu ->firstOrFail() koja će pokušati da nadje podatak u bazi a ako podatak ne postoji, vratila bi error 404(not found), što je mnogo bolje od serverske greške error 500 i pucanja aplikacije.
Što se validacije tiče, postoji nekoliko načina i najbolji generalno je napraviti custom request klasu koja će extendovati FormRequest klasu i tako validirati request. Nju trenutno nećemo spominjati u ovom članku već ćemo prvo objasniti jednostavnije validiranje. Za naprednije obavezno preporučujemo pravljenje form request klasa.
Osnove validacije u kontroleru:
Request (request klasa ili helper metoda)
Pozvati metodu validate() na sledeća tri načina, poslati niz(array) sa imenima polja i uslovima koje svako polje treba da ispuni. Na primer imamo formu koja treba da sačuva sledeće parametre u bazi u tabeli post: title, slug, body
-
Helper metoda
$validatedAttributes = request()->validate([
‘title’ => ‘required’,
‘slug’ => ‘required|unique’,
‘body’ => ‘required’,
]);
-
ili direktno putem request objekta
$validatedAttributes = $request->validate([
‘title’ => ‘required’,
‘slug’ => ‘required|unique’,
‘body’ => ‘required’,
]);
-
Ili pozvati validate() metodu samog kontrolera
$this->validate(request(),
[
‘title’ => ‘required’,
‘slug’ => ‘required|unique’,
‘body’ => ‘required’,
]);
Pošto nam validate metoda vraca ako je uspešno prošla validacija niz(array) sa podacima, onda možemo pozvati update ili create metodu kako bi popunili bazu podataka:
Preporučljiva praksa je:
Post::create($validatedAttributes);
$validatedAttributes je varijabla u koju smo saćuvali vrednost niza koji nam je vratio request validacija iznad.
Često programeri greše i ne znaju da validacija automatski vraća validiran niz i i da ga možemo iskoristiti kao u primeru iznad, pa greše i pišu ispod validacije sledeće:
Post:create([
‘title’ => request()->title,
‘slug’ => request()->slug,
‘body’ => request()->body,
]);
Ne samo što se tako lako nagomila kod i nije pregledno, već nije preporučeno i zbog preformansi opet iz requesta zahtevati parametre.
Sta uraditi dodatno:
Na front end-u dodati error poruke, kako bi se prikazale korisniku ako validacija ne uspe. Na svakom blade view-u, imamo pristup $error objektu koji ima metode koje ćemo pozvati kako bi prikazali greške ako postoje.
I prikazaće se jedino ako postoji greška, ako ne postoji neće se prikazati uopšte:
@error(‘title’)
{{ $error->first(‘title’) }}
@enderror
Ili
@if($error->has(‘title’) )
{{ $error->first(‘title’) }}
@endif
Pored ispisivanja potencijalnih grešaka, preporčueno je uraditi i sledeće:
Na front end-u u svakom inputu, u attributu “value” ubaciti old() helper metodu koja će ako validacija nije prošla ali je uspešno prošla za to input polje, onda prikazati prethodni value koji je korisnik upisao, kako ne bi morao ponovo da upisuje:
< input type=”text” name=”title” value=”old(‘title”) / >
Komentari