Laravel 12 Tippek & Trükkök Magyarul

Validálás

Validálni akkor szoktunk amikor bejövő adatunk van valahonnan. Leggyakrabban űralpokat szoktunk (amiket a felhasználó tölt ki). Validációnak minősül pl.: hogy a felhasználó kitöltötte-e a mezőt, vagy egy e-mail cím a formailag helyes-e stb.

Az alábbi példában egy nagyon egyszerű űrlapot (formot) fogunk validálni (ellenőrizni). Fontos tudni, hogy a validációt legtöbbször post metódussal végezzük, ugyanakkor a form megjelenítésére get metódust használunk.

Hozzuk létre az űrlapunkat (formot). Ehhez egy view-t kell létrehozni, neve: dolgozoForm

php artisan make:view dolgozoForm

A létrejött fájl (resources/views/dolgozoForm.blade.php) így néz ki:

<div>
    <!-- The only way to do great work is to love what you do. - Steve Jobs -->
</div>

A nézet fájlban hozzuk létre a űrlapot. Természetesen ez itt nem a teljes kód, az egyszerűség kedvéért nem használtam semmilyen formázást, vagy adatkitöltést.

  • A @csrf minden form-ba (ami post metódusos) bele kell írni! Ez védi a rendszerünket a külső forrásból érkező adatoktól (pl.: robotok)
  • A @error('xxx') {{$message}} @enderror jeleníti meg a hibaüzenetet az adott form elemhez. Az xxx helyére a form elem name értékét kell írni!
  • Az "{{old('xxx')}}" arra való, hogy hibás kitöltés esetén a mezőbe írt értéket visszatöltse. Az xxx helyére a form elem name értékét kell írni!
...	
<form method="POST">
    @csrf
    <label for="nev">Név:</label>
    <input type="text" name="nev" id="nev" value="{{old('nev')}}" >
    @error('nev')
      {{$message}}
    @enderror

    <label for="email">E-mail cím:</label>
    <input type="email" name="email" id="email" value="{{old('email')}}" >
    @error('email')
      {{$message}}
    @enderror

    <button type="submit">Beküldés</button>
</form>
....

Készítsünk egy controllert ami majd az útvonalakat dolgozza fel, parancssorban adjuk ki az alábbi parancsot:

php artisan make:controller DolgozoController

A létrejött fájl (app/Http/Controllers/DolgozoController.php) így néz ki:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class DolgozoController extends Controller{
	//
}

Először írjuk meg azt a függvényt ami a form megjelenítéséért felelős.

namespace App\Http\Controllers;
	
use Illuminate\Http\Request;

class DolgozoController extends Controller{
	public function create(){
		return view("dolgozoForm");
	}
}

Állítsuk be, hogy a /dolgozo-rogzites url-n az elkészített form jelenjen meg. Nevezzük is el az url-t a name() használva (ez arra jó, hogy nem kell majd konkrét url címet megadni amikor hivatkozunk valahol). (routes/web.php)

use App\Http\Controllers\DolgozoController;

Route::get('/dolgozo-rogzites',[DolgozoController::class,'create'])->name('dolgozoform');

És ha már ott vagyunk a fájlba akkor állítsuk be azt is, hogy a /dolgozo-rogzites dolgozza is majd fel a kérést, a store metódussal. FIGYELEM! Az url cím ugyanaz lesz, de már post metódussal! (routes/web.php)

use App\Http\Controllers\DolgozoController;

Route::get('/dolgozo-rogzites',[DolgozoController::class,'create']);
Route::post('/dolgozo-rogzites',[DolgozoController::class,'store']);

A controller fájlban hozzuk létre a store() metódust (app/Http/Controllers/DolgozoController.php).

  • A Request $req mint bemenő paramétert adjuk meg, ez arra kell, hogy a formból érkező adatokat elérjük.
  • A validate() metódusnak két paramétere van, mind a kettő tömb. Az első tömbben a validációs szabályokat kell megadni. Egy mezőhöz több szabályt is adhatunk. A második tömben a kiírandó üzeneteket kell meghatározni (Amiket a view-ban a $message helyére kerülnek).
namespace App\Http\Controllers;
	
	use Illuminate\Http\Request;
	
	class DolgozoController extends Controller{
		public function create(){
			return view("dolgozoForm");
		}

		public function store(Request $req){
			 $req->validate(
				[
					/*Ide kerülnek a validációs szabályok*/
				],
				[
					/*Ide kerülnek a validációs szabályok üzenetei*/
				]
			 );
			/*Ettől a résztől, a kód csak akkor fut meg, ha a validálás sikeres (minden szabálynak megfelelt.)*/
		}
	}
	

Ebben a példában a név mezőt szeretném validálni arra, hogy kötelező (request) legyen kitölteni, valamint minimum 5 karaktert (min:5) be kelljen írni. Az email mező kitöltése szintén kötelező (request), valamint szintaktikailag helyesnek (email:rfc) kell lennie.

A validációs szabályok szintakszisa: "mező neve" => "validációs szabályok | -el elválasztva.
A validációs szabályok üzenetének szintakszisa: "mező neve.validációs szabály" => "üzenet amit ki írunk"

Az, hogy milyen előre megírt validációs szabályok vannak a laravel oldalán meg lehet nézni. Tehát a fent említett store() metódust az előbb leírt szabályoknak megfelelően megírom:

...
public function store(Request $req){
	$req->validate(
		[
			"nev" => "request|min:5",
			"email" => "request|email:rfc"
		],
		[
			"nev.request" => "A név mező kitöltése kötelező",
			"nev.min" => "Névnek minimum 5 karaktert meg kell adni",

			"email.request" => "Az email mező kitöltése kötelező",
			"email.email" => "Az e-mail cím formátuma nem megfelelő" 
		]
	);
	/*Ettől a résztől, a kód csak akkor fut meg, ha a validálás sikeres (minden szabálynak megfelelt.)*/
}
...

Amennyiben a validálási szabályokon átmegy a kérés, úgy az érkező adatokat feldolgozhatjuk. Ezt legtöbb esetben modelleket felhasználva tesszük. Az alábbi példában az adatok mentését mutatom meg (de lehetne firssítés, vagy akár törlés is).