【新手教程】YII自带的模型验证使用

jerry Yii 2015年08月11日 收藏

 Php代码

// CValidator.php  
public static $builtInValidators=array(  
    'required'=>'CRequiredValidator',               // 验证属性值必需有值,不能为空  
    'filter'=>'CFilterValidator',                          // 用过滤器转换属性的值  
    'match'=>'CRegularExpressionValidator',    // 验证属性值匹配一个正则表达式  
    'email'=>'CEmailValidator',                       // 验证属性值为有一个有效的Email地址  
    'url'=>'CUrlValidator',                                // 验证属性值是一个有效的URL  
    'unique'=>'CUniqueValidator',                    // 验证属性值在表中的对应列中是唯一的  
    'compare'=>'CCompareValidator',              // 验证属性值与另一个属性的值相等  
    'length'=>'CStringValidator',                      // 验证属性值的长度在一个范围内  
    'in'=>'CRangeValidator',                           // 验证属性值在一个预定义列表中  
    'numerical'=>'CNumberValidator',              // 验证属性值是数字  
    'captcha'=>'CCaptchaValidator',                // 验证属性的值等于一个显示的CAPTCHA(验证码)的值  
    'type'=>'CTypeValidator',                         // 验证属性值是一个指定的数据类型  
    'file'=>'CFileValidator',                             // 验证属性值包含上传的文件  
    'default'=>'CDefaultValueValidator',          // 验证属性值为分配的默认值  
    'exist'=>'CExistValidator',                         // 验证属性值在表中的对应列中存在  
    'boolean'=>'CBooleanValidator',               // 验证属性值是布尔值(true或false)  
    'safe'=>'CSafeValidator',                         // 标记属性值为安全  
    'unsafe'=>'CUnsafeValidator',                   // 标记属性值为不安全  
    'date'=>'CDateValidator',                         // 验证属性值是日期  
);

使用方法就是在 CActiveRecord 或 CFormModel 的子类中重写 rules() 函数,如下:
Php代码

public function rules()  
{  
    return array(  
        array('username,email,password,password2', 'required'),  
        array('username', 'length', 'min'=>6, 'max'=>24),  
        array('email', 'email'),  
        array('password', 'length', 'min'=>6, 'max'=>16),  
        array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),  
    );  
}

rules() 中返回的数组一般如下:
Php代码 

array('属性名1,属性名2', '验证器别名', 'on'=>'场景', '验证器属性'=>'值', '...'=>'...')


array() 中前两个值是必须的,后面则是可选的,当然你要看具体验证器了
当有多个属性要使用同一个验证器时,可以写在同一条规则中,属性名使用英文逗号分隔
验证器别名是必须的
'on'=>'场景' 是可选的, 场景是在初始化某个具体的 CActiveRecord 类时通过构造函数设定的。
如:
class Post extends CActiveRecord
在控制器类中

$model=new Post('search');

其中 'search' 就是场景,这样就设置了场景。
当然,CActiveRecord 类的构造函数中,场景的默认值是 'insert'
然后,验证器属性则要看某个具体验证器了,如
Php代码

class CStringValidator extends CValidator  
{  
    public $max;  
    public $min;  
    public $is;  
    public $tooShort;  
    public $tooLong;  
    public $allowEmpty=true;  
    public $encoding;

验证器中的验证可以定制,例如LoginForm中的password
Php代码

public function rules()  
    {  
        return array(  
            // username and password are required  
            array('username, password', 'required'),  
            // rememberMe needs to be a boolean  
            array('rememberMe', 'boolean'),  
            // password needs to be authenticated  
            array('password', 'authenticate'),  
        );  
    }

Php代码

/** 
 * Authenticates the password. 
 * This is the 'authenticate' validator as declared in rules(). 
 */  
public function authenticate($attribute,$params)  
{  
    $this->_identity=new UserIdentity($this->username,$this->password);  
    if(!$this->_identity->authenticate())  
        $this->addError('password','Incorrect username or password.');  
}