public function validateItem($key, $input) : bool
{
// w/out any rules element is valid
if (!isset($this->validators[$key])) {
return true;
}
$validators = $this->validators[$key];
// check be validators
// extract input from ...
if (is_array($input) && isset($input[$key])) {
// array
$value = $input[$key];
} elseif (is_object($input) && isset($input->{$key})) {
// object
$value = $input->{$key};
} else {
// ... oh, not exists key
// check chains for required
$required = false;
foreach ($validators as $validator) {
/* @var Validator $validator */
if ($validator->isRequired()) {
$required = true;
break;
}
}
if ($required) {
$value = '';
} else {
return true;
}
}
// run validators chain
foreach ($validators as $validator) {
/* @var Validator $validator */
if (!$validator->getName()) {
// setup field name as property name
$validator->setName(ucfirst($key));
}
if (!$validator->validate($value)) {
if (!isset($this->errors[$key])) {
$this->errors[$key] = [];
}
$this->errors[$key][] = $validator->getError();
return false;
}
}
return true;
}