I started improving my validator library even more, and I think I'm at the last final element (domain object / entity validations) before I can gladly say that my Validator library is completely done and it supports all of it.
Here you can see that my validator can already deal with regular variable inputs or non-entity inputs (certain forms for example).
I started figuring out how I could extend my validator to create domain object validators and here is my attempt.
Could anybody review it and see if you find any room for improvements and give constructive feedback?
User
class User
{
public $name;
public $email;
public $age;
}
UserValidator
class UserValidator extends Validator
{
public function __construct()
{
$rules['name'] = [new MaxChars(20), new Alpha(true)];
$rules['email'] = [new Email()];
$rules['age'] = [new Numeric(), new Between(13, 17)];
$this->setRule('name', $rules['name']);
$this->setRule('email', $rules['email']);
$this->setRule('age', $rules['age']);
}
public function validate(User $user)
{
$this->errors = [];
parent::validate('name', $user->name);
parent::validate('email', $user->email);
parent::validate('age', $user->age);
return empty($this->errors);
}
}
Validator
class Validator
{
protected $rules = [];
protected $errors = [];
public function getErrors($rulename = null)
{
if ($rulename) {
return isset($this->errors[$rulename]) ? $this->errors[$rulename] : [];
}
return $this->errors;
}
public function setRule($name, Array $rules, $required = true)
{
$this->rules[$name]['rules'] = $rules;
switch (true) {
case ($required === true):
$this->rules[$name]['required'] = 'Must not be null or empty.';
break;
case ($required === false):
$this->rules[$name]['required'] = false;
break;
default:
$this->rules[$name]['required'] = $required;
break;
}
}
public function validate($rulename, $input)
{
if ($this->rules[$rulename]['required']) {
if (empty($input)) {
$this->errors[$rulename][] = $this->rules[$rulename]['required'];
}
foreach ($this->rules[$rulename]['rules'] as $rule) {
if (!$rule->check($input)) {
$this->errors[$rulename][] = $rule->getError();
}
}
} elseif (!empty($input)) {
foreach ($this->rules[$rulename]['rules'] as $rule) {
if (!$rule->check($input)) {
$this->errors[$rulename][] = $rule->getError();
}
}
}
return isset($this->errors[$rulename]);
}
}
Example
$user = new User();
$user->name = 'John Doe';
$user->email = '[email protected]';
$user->age = 13;
$uv = new UserValidator();
$uv->validate($user)); //true
$uv->getErrors()); //empty array
Alpha
orNumeric
, don't you? – Madara Uchiha Jun 24 '14 at 14:19[]
equalsarray()
. – Kid Diamond Jun 24 '14 at 14:55