要实现自动验证,只需在Model类里事先定义好验证的方法,然后在其他类定义好要验证数据的格式,在继承Model就可以使用了
对POST数据要验证的格式
$this->valid = array(
array('验证的字段名',0/1/2(验证场景),'报错提示','require/in(某几种情况)/length(范围)/between(某个范围)');
);
具体例子如下:
protected $_valid = array(
array('goods_name',1,'必须有商品名','require'),
array('cat_id',1,'栏目id必须是整型值','number'),
array('is_new',0,'is_new只能是0或1','in','0,1'),
array('goods_brief',2,'商品简介就在10到100字符','length','10,100')
);
Model类里定义的自动验证方法
/**
*自动验证
*@param $data array 已经对POST数据完成自动过滤和自动完成操作的数据
*@return true/false bool 验证失败返回false 成功返回true
*/
public function _validate($data){
if(empty($this->_valid)){//没有先定义验证格式就调用这个方法,则返回true
return true;
}
$this->error = array();
foreach ($this->_valid as $k => $v) {
switch ($v[1]) {
case 1:
if(!isset($data[$v[0]]) ){
$this->error[] = $v[2];
return false;
}
if(!$this->check($data[$v[0]], $v[3])){
$this->error[] = $v[2];
return false;
}
break;
case 0:
if(isset($data[$v[0]])){
if(!$this->check($data[$v[0]],$v[3],$v[4])){
$this->error[] = $v[2];
return false;
}
}
break;
case 2:
if( isset($data[$v[0]]) && !empty( $data[$v[0]] ) ){
if(!$this->check($data[$v[0]],$v[3],$v[4])){
$this->error[] = $v[2];
return false;
}
}
default:
break;
}
}
return true;
}
/**
*自动验证的规则检查
*@param $value 找POST数据里验证字段为下标对应的数据
*@param $rule string 验证规则:require,in,number,length...
*@param $parm string 要验证的可选参数范围设定
*@return true/false bool
*/
protected function check($value,$rule='',$parm=''){
switch ($rule) {
case 'require':
return !empty($value);
case 'number':
return is_numeric($value);
case 'in':
$tmp = explode(',', $parm);
return in_array($value, $tmp);
case 'between':
list($min,$max) = explode(',', $parm);
return $value >= $min && $value <=$max;
case 'length':
list($min,$max) = explode(',', $parm);
return mb_strlen($value) >= $min && mb_strlen($value) <= $max;
default:
return false;
}
}
/**
*存储验证格式里预先定义好的错误信息
*/
public function getErr(){
return $this->error;
}