Данный компонент позволяет использовать валидаторы Yii без создания модели. В нашем проекте он используется для валидации входящих параметров процедур API контроллера.

Пример использования:

/**
     * Процедура отправки кода подтверждения телефона при регистрации.
     *
     * @param string $phone_number Номер телефона для подтверждения
     * @return StatusResult Статус выполнения
     * @throws InvalidParamsException При некорректных параметрах
     */
    public static function sendCheckCode($phone_number)
    {
        $rules = array(
            array('phone_number', 'required'),
            array('phone_number', 'PhoneNumberValidator'),
        );
        if (!RequestValidator::validateRequest($rules, array('phone_number' => $phone_number))) {
            throw new InvalidParamsException(RequestValidator::getValidationTextError());
        }
 
        $success = CheckCode::sendCode($phone_number);
        return new StatusResult($success);
    }

Код компонента валидатора:

/**
 * Class RequestValidator
 *
 * Класс позволяет использовать валидаторы Yii без создания модели.
 * Удобно при валидации входящих параметров процедур API
 */
class RequestValidator extends CFormModel {
 
    /**
     * Поля для валидации
     * @var
     */
    protected $_values;
 
    protected static $_errors;
    protected static $_message;
 
    public function __get($name)
    {
        if (isset($this->_values[$name])) {
            return $this->_values[$name];
        }
        return null;
    }
 
    public function __set($name, $value)
    {
        if (isset($this->_values[$name])) {
            $this->{$name} = $value;
        }
    }
 
    public function setValues($values)
    {
        if (is_object($values)) {
            $this->_values = (array)$values;
        }
        elseif (is_array($values)) {
            $this->_values = $values;
        }
        else {
            throw new CInternalErrorException("Values must be array or object (param => value)");
        }
    }
 
    /**
     * Валидирует переданные значения по правилам валидации
     *
     * @param array $rules Правила валидации
     * @param $values Объект или массив значений
     * @param $clear_errors Очищает последние ошибки
     * @return bool
     * @throws CInternalErrorException
     */
    static function validateRequest(array $rules, $values, $clear_errors = true)
    {
        if ($clear_errors) {
            self::$_errors=null;
            self::$_message=null;
        }
 
        $dummy = new RequestValidator();
        $dummy->setValues($values);
        foreach ($rules as $rule) {
            if (isset($rule[0],$rule[1])) {
                $validator = CValidator::createValidator(
                    $rule[1],
                    $dummy,
                    $rule[0],
                    array_slice($rule,2)
                );
                $validator->validate($dummy);
            }
            else {
                throw new CInternalErrorException("Dummy model validator incorrect. Must be set rule[0] (param) and rule[1] (validator)");
            }
        }
 
        if ($dummy->hasErrors()) {
            $text = '';
            self::$_errors = $dummy->getErrors();
            foreach (self::$_errors as $attr_name => $attribute) {
                foreach ($attribute as $error) {
                    $text = "#$attr_name: $error";
                    break;
                }
            }
            self::$_message = $text;
        }
        return !$dummy->hasErrors();
    }
 
    public static function getValidationErrors()
    {
        return self::$_errors;
    }
 
    public static function getValidationTextError()
    {
        if (empty(self::$_message) && !empty(self::$_errors)) {
            foreach (self::$_errors as $attr_name => $attribute) {
                foreach ($attribute as $error) {
                    return self::$_message = "$error";
                }
            }
        }
        return self::$_message;
    }
 
}

Спасибо коллеге

Комментарии

comments powered by Disqus