Piszemy prosty walidator. Później przejdziemy na coś bardziej zaawansowanego, na razie prosta klasa z metodami statycznymi. Do dzieła!

Tak wygląda to, co chcemy walidować:

<?php 

$form_rules =  [
    'email' => ['required', 'email'],
    'password' => ['required'],
    'confirmPassword' => ['required', 'match:password']
];

$form_data = [ 
    'email' => 'john.doe@gmail.com',
    'password' => md5('helloworld'),
    'confirmPassword' => md5('helloworld')
];

//rule1 - email:
$field1 = 'email';
$params1 = array();

//rule2 - match
$field2 = 'confirmPassword';
$params2 = array('password');

Prosta klasa:

class Validation
{
  
  public static function string($value, $min = 1, $max = INF)
  {
    if (is_string($value)) {
      $value = trim($value);
      $length = strlen($value);
      return $length >= $min && $length <= $max;
    }

    return false;
  }

  
  public static function email($value)
  {
    $value = trim($value);

    return filter_var($value, FILTER_VALIDATE_EMAIL);
  }

 
  public static function match($value1, $value2)
  {
    
    return $value1 === $value2;
  }
}

Użycie:

<?php 

//(...)

$form_data = [ 
    'email' => 'john.doe@gmail.com',
    'password' => md5('helloworld'),
    'confirmPassword' => md5('helloworld')
];

//rule1 - email:
$field1 = 'email';
$params1 = array();

//rule2 - match
$field2 = 'confirmPassword';
$params2 = array('password');

class Validation
{
  
 //(...)

  
  public static function email($value)
  {
    $value = trim($value);

    return filter_var($value, FILTER_VALIDATE_EMAIL);
  }

  //(...)
}

var_dump(Validation::email($form_data[$field1]));
//string(18) "john.doe@gmail.com"
var_dump(Validation::email($form_data[$field2]));
//bool(false)

Warto nieco zmienić typ zwracany przez filter_var:

class Validation
{
  
  //(...)
  
  public static function email($value)
  {
    $value = trim($value);

    return (bool)filter_var($value, FILTER_VALIDATE_EMAIL);
  }

  //(...)
}

var_dump(Validation::email($form_data[$field1]));
//bool(true)
var_dump(Validation::email($form_data[$field2]));
//bool(false)

Teraz match:

//(...)
$form_data = [ 
    'email' => 'john.doe@gmail.com',
    'password' => md5('helloworld'),
    'confirmPassword' => md5('helloworld')
];

//rule1 - email:
$field1 = 'email';
$params1 = array();

//rule2 - match
$field2 = 'confirmPassword';
$params2 = array('password');

class Validation
{
  
  //(...)

 
  public static function match($value1, $value2)
  {
    return $value1 === $value2;
  }
}

var_dump(Validation::match($form_data[$field2], $form_data[$params2[0]]));
//bool(true)
var_dump(Validation::match($form_data[$field1], $form_data[$params2[0]]));
//bool(false)

Jak widać używanie tej klasy nie jest takie proste, jak sama klasa i przydałby się jakiś adapter i fasada – albo po prostu napiszemy coś lepszego, co zrobimy w następnej lekcji.