Laravel validacija podataka se poboljšava sa prilagođenim pravilima
U razvoju softverskih projekata, pravila validacije podataka su osnovni korak koji osigurava ispravnost ulaznih podataka.
Međutim, često se nađemo u radu s alatima ili u scenarijima u kojima integrirana pravila validacije nisu dovoljna.
Laravelov sistem za validaciju podataka ima skup osnovnih pravila, koja se mogu obogatiti prilagođenim pravilima, koja nam omogućavaju da kreiramo višekratnu i testiranu logiku validacije za naše aplikacije.
Pogledajmo u ovom članku kako kreirati i koristiti prilagođena pravila za provjeru valjanosti podataka u Laravelu.
3 minute
Zašto koristiti prilagođena pravila provjere valjanosti podataka?
L'uso di pravila di validacija podataka prilagođeno u Laravel, nudi nekoliko prednosti:
- Ponovna upotreba u cijeloj aplikaciji
- Enkapsulacija složene logike validacije
- Jednostavniji test pravila
- Čistiji, čitljiviji kod
Kreiranje prilagođenog pravila validacije podataka
Hajde da napravimo jedan pravilo prilagođeno za validate složene lozinke, a za to koristimo sljedeću naredbu:
php artisan make:rule StrongPassword
Zatim idemo na prilagođavanje metode passes()
gdje specificiramo pravilo di prihvatanje, i metodu message()
gdje specificiramo poruku za prikaz kada se pravilo to se ne poštuje
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class StrongPassword implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
// Password must be at least 8 characters and contain at least one uppercase letter, one lowercase letter, and one number
return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute must be at least 8 characters and contain at least one uppercase letter, one lowercase letter, and one number.';
}
}
Korištenje prilagođenog pravila
Možete koristiti ovo pravilo prilagođeno u zahtjevima modula, u kontroler ili gde god da pokrenete validacija dati. U nastavku vam dajem dva primjera upotrebe pravila StrongPassword, oba u obrazac zahtjeva to u kontroler.
use App\Rules\StrongPassword;
// In a form request
public function rules()
{
return [
'password' => ['required', new StrongPassword],
];
}
// In a controller
public function store(Request $request)
{
$request->validate([
'password' => ['required', new StrongPassword],
]);
// Process the validated data...
}
Napredne tehnike
Parametrizovana pravila
Možete napraviti svoje pravila fleksibilnije prilagođavanje prihvatanjem parametara. U sljedećem primjeru imamo a pravilo po l 'prihvatanje minimalnog "parametrizovanog" broja riječi. Parametar "broj riječi" je postavljen u metodi konstruktora:
klasa MinWords implementira pravilo
{
privatni $minWords;
javna funkcija __construct($minWords)
{
$this->minWords = $minWords;
}
javna funkcija prolazi ($attribute, $value)
{
return str_word_count($value) >= $this->minWords;
}
poruka javne funkcije()
{
return ":attribut mora sadržavati najmanje {$this->minWords} riječi.";
}
}
// Upotreba
'description' => ['potrebno', nove MinWords(5)]
Korištenje zavisnosti
Ako vaše pravilo treba da stupi u interakciju s drugim uslugama ili bazom podataka, možete koristiti Laravelov servisni kontejner:
klasa UniqueInOrganization implementira pravilo
{
privatna $organizacija;
javna funkcija __construct($organizacija)
{
$this->organization = $organizacija;
}
javna funkcija prolazi ($attribute, $value)
{
return !User::where('organization_id', $this->organization->id)
->gdje ($atribut, $vrijednost)
->postoji();
}
poruka javne funkcije()
{
return 'Atribut :atribut je već uzet unutar vaše organizacije.';
}
}
Testiranje prilagođenih pravila validacije podataka
Jedna od glavnih prednosti prilagođenih pravila je da se lako mogu testirati:
koristite App\Rules\StrongPassword;
class StrongPasswordTest proširuje TestCase
{
/** @test */
javna funkcija it_passes_for_strong_passwords()
{
$rule = nova StrongPassword;
$this->assertTrue($rule->passes('password', 'StrongPass1'));
$this->assertFalse($rule->passes('password', 'weakpass'));
}
}