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

jerry Yii 2015年08月11日 收藏

 Php代码

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

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

  1. public function rules()  
  2. {  
  3.     return array(  
  4.         array('username,email,password,password2', 'required'),  
  5.         array('username', 'length', 'min'=>6, 'max'=>24),  
  6.         array('email', 'email'),  
  7.         array('password', 'length', 'min'=>6, 'max'=>16),  
  8.         array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),  
  9.     );  
  10. }

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

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


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

  1. $model=new Post('search');

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

  1. class CStringValidator extends CValidator  
  2. {  
  3.     public $max;  
  4.     public $min;  
  5.     public $is;  
  6.     public $tooShort;  
  7.     public $tooLong;  
  8.     public $allowEmpty=true;  
  9.     public $encoding;

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

  1. public function rules()  
  2.     {  
  3.         return array(  
  4.             // username and password are required  
  5.             array('username, password', 'required'),  
  6.             // rememberMe needs to be a boolean  
  7.             array('rememberMe', 'boolean'),  
  8.             // password needs to be authenticated  
  9.             array('password', 'authenticate'),  
  10.         );  
  11.     }

Php代码

  1. /** 
  2.  * Authenticates the password. 
  3.  * This is the 'authenticate' validator as declared in rules(). 
  4.  */  
  5. public function authenticate($attribute,$params)  
  6. {  
  7.     $this->_identity=new UserIdentity($this->username,$this->password);  
  8.     if(!$this->_identity->authenticate())  
  9.         $this->addError('password','Incorrect username or password.');  
  10. }