Zbieramy do kupy walidator, na razie tworząc metodę, która parsuje reguły. Zrozumienie jak ona działa pozwoli nam dopiąć temat. Do dzieła.
Na początku odkomentujemy reguły zaś zakomentujemy data:
$form_rules = [
'email' => ['required', 'email'],
'password' => ['required'],
'confirmPassword' => ['required', 'match:password'],
'name' => ['unique:people.name', 'maxLength:20'],
'country' => ['in:USA,Poland'],
'age' => ['min:18']
];
/*
$form_data = [
'email' => 'john.doe@gmail.com',
'password' => md5('helloworld'),
'confirmPassword' => md5('helloworld'),
'name' => 'Janet',
'country' => 'USA',
'age' => 19
];
*/
Wrzucimy sobie jeszcze interfejs, abyśmy zrozumieli, dlaczego dotychczas stosowaliśmy zdawałoby się dziwną, ale praktyczną konwencję:
interface RuleInterface
{
public function validate(array $data, string $field, array $params): bool;
public function getMessage(array $data, string $field, array $params): string;
}
Teraz piszemy metodę pokazującą nasze pola i reguły:
class Validator {
public static function parseRules($schema){
foreach($schema as $field => $rules){
echo "Field: $field <br>";
foreach($rules as $rule){
if (!str_contains($rule, ':')) {
echo "Rule: $rule <br>";
continue;
}
[$rule, $ruleParams] = explode(':', $rule);
$ruleParams = explode(',', $ruleParams);
echo "Rule: $rule <br>";
echo "Params: ";
print_r($ruleParams);
echo "<br>";
}
}
}
}
Na przykładzie to zrozumiemy najlepiej:
$form_rules = [
'email' => ['required', 'email'],
'password' => ['required'],
'confirmPassword' => ['required', 'match:password'],
'name' => ['unique:people.name', 'maxLength:20'],
'country' => ['in:USA,Poland'],
'age' => ['min:18']
];
//(...)
Validator::parseRules($form_rules);
// Field: email
// Rule: required
// Rule: email
// Field: password
// Rule: required
// Field: confirmPassword
// Rule: required
// Rule: match
// Params: Array ( [0] => password )
// Field: name
// Rule: unique
// Params: Array ( [0] => people.name )
// Rule: maxLength
// Params: Array ( [0] => 20 )
// Field: country
// Rule: in
// Params: Array ( [0] => USA [1] => Poland )
// Field: age
// Rule: min
// Params: Array ( [0] => 18 )
Analizujmy to aż zrozumiemy, bo w następnej lekcji będziemy już tego używać!