Rozbudowa walidatora – tym razem coś łatwiejszego i niewymagającego połączenia z bazą danych czyli InRule. Do dzieła.
Nasz projekt dotychczas:
/*
$form_rules = [
'email' => ['required', 'email'],
'password' => ['required'],
'confirmPassword' => ['required', 'match:password'],
'name' => ['unique:people.name'],
'country' => ['in:USA,Poland']
];
*/
$form_data = [
'email' => 'john.doe@gmail.com',
'password' => md5('helloworld'),
'confirmPassword' => md5('helloworld'),
'name' => 'Janet',
'country' => 'USA'
];
interface RuleInterface
{
public function validate(array $data, string $field, array $params): bool;
public function getMessage(array $data, string $field, array $params): string;
}
class RequiredRule implements RuleInterface
{
//(...)
}
class EmailRule implements RuleInterface
{
//(...)
}
class UrlRule implements RuleInterface
{
//(...)
}
class MatchRule implements RuleInterface
{
//(...)
}
class ConfigINI {
//(...)
}
class PDOConnection {
//(...)
}
class UniqueRule implements RuleInterface
{
//(...)
}
Sprawdzamy czy wszystko na swoim miejscu, jak tak, to piszemy InRule:
class InRule implements RuleInterface
{
public function validate(array $data, string $field, array $params): bool
{
return in_array($data[$field], $params);
}
public function getMessage(array $data, string $field, array $params): string
{
return "Invalid selection";
}
}
Argumenty przekażemy tak, jak je będziemy otrzymywać:
$field = 'country';
$rule = new InRule;
$params = explode(',', 'USA,Poland');
$in = $rule->validate($form_data, $field, $params);
if(!$in){
echo $rule->getMessage($form_data, $field, $params);
}
Działa. Teraz zamieńmy państwa:
$field = 'country';
$rule = new InRule;
$params = explode(',', 'Germany,Hungary');
$in = $rule->validate($form_data, $field, $params);
if(!$in){
echo $rule->getMessage($form_data, $field, $params);
}
//Invalid selection
Sprawdźy, czy w przypadku jednego argumentu też sobie poradzi:
$field = 'country';
$rule = new InRule;
$params = explode(',', 'Germany');
$in = $rule->validate($form_data, $field, $params);
if(!$in){
echo $rule->getMessage($form_data, $field, $params);
}
//Invalid selection
Ok. Rozbudowa w kolejnych lekcjach.