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; }