【问题标题】:Yii CValidator Rules : how to validate outside of a modelYii CValidator 规则:如何在模型之外进行验证
【发布时间】:2012-09-25 10:03:35
【问题描述】:

我需要验证 Yii 中的一些变量值;

我没有model,我需要预构建 yii public method

其中一些必须是整数,其他必须是字符串;

值通过 GET 传递。

我尝试了 yii 的所有验证类,但没有一个有效。

有没有人尝试过并且成功了?

我需要类似的东西:

$validator = new CValidator();

$result = $validator->validate(array($key=>$value));

已接受建议

【问题讨论】:

  • 为什么不创建一个带有验证规则的模型呢?应该比直接使用 CValidator 更容易
  • 是的,但我需要知道是否有其他方法可以做到这一点,因为模型会经常更改并且会出错
  • 如果您的模型发生变化,您只需更新验证规则。否则你将不得不更新你的自定义验证代码,这不是很合适......

标签: validation yii


【解决方案1】:

您可以为特定的验证器执行此操作:

$Validator = new CEmailValidator;

if($Validator->validateValue($value))
{
    // Valid
}

来自 Yii 框架文件 CEmailValidator.php:

/**
* Validates a static value to see if it is a valid email.
* Note that this method does not respect {@link allowEmpty} property.
* This method is provided so that you can call it directly without going through the model validation rule mechanism.
* @param mixed $value the value to be validated
* @return boolean whether the value is a valid email
* @since 1.1.1
*/
public function validateValue($value)

【讨论】:

    【解决方案2】:

    Yii 验证器与模型紧密集成。所以,至少你需要一个虚拟模型对象。

    我的建议是......创建一个虚拟表单模型类......

    class MyValidator extends CFormModel {
        public function __get($name) {
            return isset($_POST[$name])?$_POST[$name]:null;
        }
    
        static function myValidate( Array $rules ) {
            $dummy = new MyValidator();
    
            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 error; */ }
            }
    
            print_r( $dummy->getErrors() );
            return !$dummy->hasErrors();
        }
    }
    

    并在任何地方使用此 myValidate 静态方法,如下所示...

    $rules = array(
        array('name, email', 'required'),
        array('email', 'email'),
    );
    
    
    if( MyValidator::myValidate($rules) ) {
        ....
    }
    

    【讨论】:

    • 10x 的建议和解决方案
    • 查看@JamesG 的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多