예제 #1
0
 /**
  * 用多组规则断言关联数组的值
  * 
  * 每个关联数组的元素均对应一组验证规则,如果这组验证规则不存在,则当成此元素无须验证
  * 只有当关联数组的所有元素都通过其对应的组验证规则时,assert_arr() 方法才会返回 true。
  * 
  *
  * 用法:
  * assert_arr(
  *      array(
  *          'name' => 'iamsese' ,
  *          'age' => 26
  *      ), 
  *      array(
  *         'name' => array(
  *              array('not_empty', '用户名不能为空'),
  *              array('min_length', 5, '用户名不能少于 5 个字符'),
  *              array('max_length', 20, '用户名不能超过 20 个字符'),
  *         ) ,
  *         
  *         'age' => array(
  *              array('not_null', '年龄不能为空'),
  *              array('is_int', '年龄必须是整数'),
  *              array('between',18,50,true,'年龄必须是[18,50]的整数'),
  *         ) ,
  *      ),
  *      $flds_failed 
  * );
  * 
  * * 如果提供了 $flds_failed 参数,则验证失败的规则会存储在 $failed 参数中
  * 
  * @param array $row 要验证的关联数组
  * @param array $flds_rules 关联数组的键对应的多组规则
  * @param mixed $flds_failed 保存验证失败的 字段->错误信息 的关联数组
  * @param boolean $withFailedRule 是否保存验证失败的规则信息
  * 
  * @return boolean 验证结果
  */
 public static function assert_arr(array $row, array $flds_rules = null, &$flds_failed = null, $withFailedRule = false)
 {
     if (empty($flds_rules)) {
         return true;
     }
     $verify = Verify::getInstance();
     if (empty($row)) {
         $row = array();
     }
     $flds_failed = array();
     foreach ($flds_rules as $fld => $rules) {
         if (empty($rules)) {
             continue;
         }
         if (!isset($row[$fld])) {
             $row[$fld] = null;
         }
         $value = $row[$fld];
         $errors = array();
         // $fld -> errorInfo
         foreach ($rules as $index => $rule) {
             // $rule => array(validation, validationParams, errorInfo)
             // 无效的规则,则视为true
             if (empty($rule[0])) {
                 unset($rules[$index]);
                 continue;
             }
             if (is_string($rule[0])) {
                 if (method_exists($verify, $rule[0])) {
                     $rule[0] = array(&$verify, $rule[0]);
                 }
             }
             $callbackToString = self::str_callback($rule[0]);
             if (empty($callbackToString)) {
                 unset($rules[$index]);
                 continue;
             }
             $rules[$index][0] =& $rule[0];
             // 重新补全校验规则
             $errors[$callbackToString] = array_pop($rules[$index]);
             // 弹出错误信息
         }
         $rules_failed = null;
         // 校验成功 继续下一步
         if ($verify->validateBatch($value, $rules, false, $rules_failed)) {
             continue;
         }
         if ($withFailedRule) {
             $failedRule = self::str_callback(array_pop($rules_failed));
             $flds_failed[$fld] = array('fr' => $failedRule, 'ft' => $errors[$failedRule]);
         } else {
             $flds_failed[$fld] = $errors[self::str_callback(array_pop($rules_failed))];
         }
     }
     return empty($flds_failed);
 }