diff --git a/library/think/Controller.php b/library/think/Controller.php index 600ff997..7b259ce1 100644 --- a/library/think/Controller.php +++ b/library/think/Controller.php @@ -145,10 +145,11 @@ class Controller * 验证数据 * @access protected * @param array $data 数据 - * @param string $validate 验证器名 + * @param string|array $validate 验证器名或者验证规则数组 + * @param array $message 提示信息 * @return void */ - public function validate($data, $validate) + public function validate($data, $validate, $message = []) { if (is_array($validate)) { $v = Loader::validate(); @@ -157,6 +158,10 @@ class Controller $v = Loader::validate($validate); } + if (is_array($message)) { + $v->message($message); + } + if (!$v->check($data)) { return $v->getError(); } else { diff --git a/library/think/Model.php b/library/think/Model.php index 23bfbc3b..54eff7c5 100644 --- a/library/think/Model.php +++ b/library/think/Model.php @@ -989,9 +989,12 @@ class Model protected function dataValidate(&$data) { if (!empty($this->options['validate'])) { - $validate = Loader::validate($this->name); - if (is_array($this->options['validate'])) { - $validate->rule($this->options['validate']); + $info = $this->options['validate']; + $name = is_string($info) ? $info : $this->name; + $validate = Loader::validate($name); + if (is_array($info)) { + $validate->rule($info['rule']); + $validate->message($info['msg']); } if (!$validate->check($data)) { $this->error = $validate->getError(); @@ -1893,16 +1896,19 @@ class Model /** * 设置字段验证 * @access public - * @param mixed $field 字段名或者验证规则 true表示自动读取验证器类 - * @param array|null $rule 验证规则 + * @param array|bool $rule 验证规则 true表示自动读取验证器类 + * @param array $msg 提示信息 * @return Model */ - public function validate($field = true, $rule = null) + public function validate($rule = true, $msg = null) { - if (is_null($rule)) { - $this->options['validate'] = $field; - } else { - $this->options['validate'][$field] = $rule; + if (true === $rule) { + $this->options['validate'] = $this->name; + } elseif (is_array($rule)) { + $this->options['validate'] = [ + 'rule' => $rule, + 'msg' => is_array($msg) ? $msg : [], + ]; } return $this; } diff --git a/library/think/Validate.php b/library/think/Validate.php index 77c645c4..6a8259b5 100644 --- a/library/think/Validate.php +++ b/library/think/Validate.php @@ -187,6 +187,8 @@ class Validate */ public function check(&$data, $rules = [], $scene = '') { + $this->error = []; + if (empty($rules)) { // 读取验证规则 $rules = $this->rule; @@ -194,6 +196,12 @@ class Validate // 分析验证规则 $scene = $this->getScene($scene); + // 读取提示信息 + if (isset($rules['__message__'])) { + $this->message($rules['__message__']); + unset($rules['__message__']); + } + foreach ($rules as $key => $rule) { if (strpos($key, '|')) { // 支持 字段|描述 用于返回默认错误 @@ -252,26 +260,30 @@ class Validate $result = call_user_func_array($rules, [$value, &$data]); } else { // 支持多规则验证 require|in:a,b,c|... 或者 ['require','in'=>'a,b,c',...] - // [['require|in:a,b,c|...'],['错误信息1','错误信息2']] if (is_string($rules)) { $rules = explode('|', $rules); } $error = []; foreach ($rules as $key => $rule) { - // 判断验证类型 - if (is_numeric($key) && strpos($rule, ':')) { - list($type, $rule) = explode(':', $rule, 2); - $info = $type; - } elseif (is_numeric($key)) { - $type = 'is'; - $info = $rule; + if ($rule instanceof \Closure) { + $result = call_user_func_array($rules, [$value, &$data]); } else { - $info = $type = $key; + // 判断验证类型 + if (is_numeric($key) && strpos($rule, ':')) { + list($type, $rule) = explode(':', $rule, 2); + $info = $type; + } elseif (is_numeric($key)) { + $type = 'is'; + $info = $rule; + } else { + $info = $type = $key; + } + // 验证类型 + $callback = isset($this->type[$type]) ? $this->type[$type] : [$this, $type]; + // 验证数据 + $result = call_user_func_array($callback, [$value, $rule, &$data, $field]); } - // 验证类型 - $callback = isset($this->type[$type]) ? $this->type[$type] : [$this, $type]; - // 验证数据 - $result = call_user_func_array($callback, [$value, $rule, &$data, $field]); + if (false === $result) { // 验证失败 返回错误信息 if (isset($this->message[$field . '.' . $info])) {