validate类完善 controller和model类的validate方法支持传入提示信息 model类的validate方法支持指定验证器名

This commit is contained in:
thinkphp
2016-03-20 08:19:42 +08:00
parent 53b455e11b
commit 2371b7a55e
3 changed files with 48 additions and 25 deletions

View File

@@ -145,10 +145,11 @@ class Controller
* 验证数据 * 验证数据
* @access protected * @access protected
* @param array $data 数据 * @param array $data 数据
* @param string $validate 验证器名 * @param string|array $validate 验证器名或者验证规则数组
* @param array $message 提示信息
* @return void * @return void
*/ */
public function validate($data, $validate) public function validate($data, $validate, $message = [])
{ {
if (is_array($validate)) { if (is_array($validate)) {
$v = Loader::validate(); $v = Loader::validate();
@@ -157,6 +158,10 @@ class Controller
$v = Loader::validate($validate); $v = Loader::validate($validate);
} }
if (is_array($message)) {
$v->message($message);
}
if (!$v->check($data)) { if (!$v->check($data)) {
return $v->getError(); return $v->getError();
} else { } else {

View File

@@ -989,9 +989,12 @@ class Model
protected function dataValidate(&$data) protected function dataValidate(&$data)
{ {
if (!empty($this->options['validate'])) { if (!empty($this->options['validate'])) {
$validate = Loader::validate($this->name); $info = $this->options['validate'];
if (is_array($this->options['validate'])) { $name = is_string($info) ? $info : $this->name;
$validate->rule($this->options['validate']); $validate = Loader::validate($name);
if (is_array($info)) {
$validate->rule($info['rule']);
$validate->message($info['msg']);
} }
if (!$validate->check($data)) { if (!$validate->check($data)) {
$this->error = $validate->getError(); $this->error = $validate->getError();
@@ -1893,16 +1896,19 @@ class Model
/** /**
* 设置字段验证 * 设置字段验证
* @access public * @access public
* @param mixed $field 字段名或者验证规则 true表示自动读取验证器类 * @param array|bool $rule 验证规则 true表示自动读取验证器类
* @param array|null $rule 验证规则 * @param array $msg 提示信息
* @return Model * @return Model
*/ */
public function validate($field = true, $rule = null) public function validate($rule = true, $msg = null)
{ {
if (is_null($rule)) { if (true === $rule) {
$this->options['validate'] = $field; $this->options['validate'] = $this->name;
} else { } elseif (is_array($rule)) {
$this->options['validate'][$field] = $rule; $this->options['validate'] = [
'rule' => $rule,
'msg' => is_array($msg) ? $msg : [],
];
} }
return $this; return $this;
} }

View File

@@ -187,6 +187,8 @@ class Validate
*/ */
public function check(&$data, $rules = [], $scene = '') public function check(&$data, $rules = [], $scene = '')
{ {
$this->error = [];
if (empty($rules)) { if (empty($rules)) {
// 读取验证规则 // 读取验证规则
$rules = $this->rule; $rules = $this->rule;
@@ -194,6 +196,12 @@ class Validate
// 分析验证规则 // 分析验证规则
$scene = $this->getScene($scene); $scene = $this->getScene($scene);
// 读取提示信息
if (isset($rules['__message__'])) {
$this->message($rules['__message__']);
unset($rules['__message__']);
}
foreach ($rules as $key => $rule) { foreach ($rules as $key => $rule) {
if (strpos($key, '|')) { if (strpos($key, '|')) {
// 支持 字段|描述 用于返回默认错误 // 支持 字段|描述 用于返回默认错误
@@ -252,12 +260,14 @@ class Validate
$result = call_user_func_array($rules, [$value, &$data]); $result = call_user_func_array($rules, [$value, &$data]);
} else { } else {
// 支持多规则验证 require|in:a,b,c|... 或者 ['require','in'=>'a,b,c',...] // 支持多规则验证 require|in:a,b,c|... 或者 ['require','in'=>'a,b,c',...]
// [['require|in:a,b,c|...'],['错误信息1','错误信息2']]
if (is_string($rules)) { if (is_string($rules)) {
$rules = explode('|', $rules); $rules = explode('|', $rules);
} }
$error = []; $error = [];
foreach ($rules as $key => $rule) { foreach ($rules as $key => $rule) {
if ($rule instanceof \Closure) {
$result = call_user_func_array($rules, [$value, &$data]);
} else {
// 判断验证类型 // 判断验证类型
if (is_numeric($key) && strpos($rule, ':')) { if (is_numeric($key) && strpos($rule, ':')) {
list($type, $rule) = explode(':', $rule, 2); list($type, $rule) = explode(':', $rule, 2);
@@ -272,6 +282,8 @@ class Validate
$callback = isset($this->type[$type]) ? $this->type[$type] : [$this, $type]; $callback = isset($this->type[$type]) ? $this->type[$type] : [$this, $type];
// 验证数据 // 验证数据
$result = call_user_func_array($callback, [$value, $rule, &$data, $field]); $result = call_user_func_array($callback, [$value, $rule, &$data, $field]);
}
if (false === $result) { if (false === $result) {
// 验证失败 返回错误信息 // 验证失败 返回错误信息
if (isset($this->message[$field . '.' . $info])) { if (isset($this->message[$field . '.' . $info])) {