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ć!