/** * Создание исключение из массива, описывающего параметры исключения * Обратная функция для __toArray() * @param array $errors * @return Error */ static function createFromArray($errors) { if (is_array($errors)) { if (isset($errors['code'], $errors['message'])) { $result = new Error($errors['message'], $errors['code']); if (isset($errors['children']) && is_array($errors['children'])) { foreach ($errors['children'] as $name => $e) { $result->add(self::createFromArray($e)); } } return $result; } } return new Error(); }
static function fromArray($array) { if (isset($array['_attributes']['uri'])) { $obj = Data::read($array['_attributes']['uri']); } else { if (!isset($array['class'])) { $array['class'] = '\\boolive\\core\\data\\Entity'; } $obj = new $array['class'](); } if (!empty($array['_errors'])) { $obj->_errors = Error::createFromArray($array['_errors']); } if (isset($array['_children'])) { foreach ($array['_children'] as $key => $child) { $obj->_children[$key] = self::fromArray($child); $obj->_children[$key]->_parent = $obj; if ($obj->_children[$key]->_errors) { $obj->errors()->_children->add($obj->_children[$key]->_errors); } } } $obj->_attributes = $array['_attributes']; $obj->_changes = $array['_changes']; $obj->_checked = $array['_checked']; $obj->_auto_naming = $array['_auto_naming']; $obj->_is_inner = $array['_is_inner']; return $obj; }
function setFilter(Rule $rule) { $this->filtered = Check::filter($this->input, $rule, $this->errors); return !isset($this->errors) || !$this->errors->isExist(); }
/** * Проверка и фильтр массива с учетом правил на его элементы * @param mixed $value Значение для проверки и фильтра * @param null|Error &$error Возвращаемый объект исключения, если элементы не соответсвуют правилам * @param array $args Аргументы фильтра * @return array */ static function arrays($value, &$error, $args) { $result = []; if (is_array($value)) { $err_msg = 'Некорректное структура массива или значения в нём'; // Контейнер для ошибок на элементы $error = null; //$error = new Error('Неверная структура.', 'arrays'); // Сведения о правиле $rule_sub = []; $rule_default = null; $tree = false; foreach ($args as $arg) { if (is_array($arg)) { $rule_sub = $arg; } else { if ($arg instanceof Rule) { $rule_default = $arg; } else { if (is_string($arg)) { $rule_default = Rule::$arg(); } else { if ($arg === true) { $tree = true; } } } } } // Перебор и проверка с фильтром всех элементов foreach ((array) $value as $key => $v) { $sub_error = null; if (isset($rule_sub[$key])) { // Отсутствие элемента if (isset($rule_sub[$key]->forbidden)) { $sub_error = new Error(['Элемент "%s" должен отсутствовать', $key], 'forbidden'); } else { $result[$key] = self::filter($v, $rule_sub[$key], $sub_error); } unset($rule_sub[$key]); } else { if ($rule_default) { $result[$key] = self::filter($v, $rule_default, $sub_error); } // Если нет правила по умолчанию или оно не подошло и значение является массивом if (!$rule_default || $sub_error) { // Если рекурсивная проверка вложенных массивов if ($tree && (is_array($v) || $v instanceof Values)) { $sub_error = null; $result[$key] = self::filter($v, $args, $sub_error); } } // Если на элемент нет правила, то его не будет в результате } if ($sub_error) { if (!$error) { $error = new Error($err_msg, 'arrays'); } $error->{$key}->add($sub_error); } } // Перебор оставшихся правил, для которых не оказалось значений foreach ($rule_sub as $key => $rule) { if (isset($rule->required) && !isset($rule->forbidden)) { $result[$key] = self::filter(null, $rule, $sub_error); if ($sub_error) { if (!$error) { $error = new Error($err_msg, 'arrays'); } $error->{$key}->required = "Обязательный элемент без значения по умолчанию"; } } } // Если ошибок у элементов нет, то удаляем объект исключения if (!isset($error) || !$error->isExist()) { $error = null; } } else { $error = new Error('Должен быть массивом', 'arrays'); } return $result; }