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.