改进自动验证和自动完成的 callback类型

This commit is contained in:
thinkphp
2016-02-16 21:21:46 +08:00
parent 8d4b2ae630
commit 78cd92bfeb

View File

@@ -1042,7 +1042,7 @@ class Model
$result = true; $result = true;
if ($val instanceof \Closure) { if ($val instanceof \Closure) {
// 匿名函数验证 支持传入当前字段和所有字段两个数据 // 匿名函数验证 支持传入当前字段和所有字段两个数据
$result = App::invokeFunction($val, [$value, $data]); $result = call_user_func_array($val, [$value, &$data]);
} elseif (is_string($val)) { } elseif (is_string($val)) {
// 行为验证 // 行为验证
$result = Hook::exec($val, '', $data); $result = Hook::exec($val, '', $data);
@@ -1052,7 +1052,12 @@ class Model
} }
if (true !== $result) { if (true !== $result) {
// 没有返回true 则表示验证失败 // 没有返回true 则表示验证失败
$this->error[$key] = $result; if (is_array($result)) {
// 返回组装的错误信息
$this->error = $result;
} else {
$this->error[] = ['key' => $key, 'error' => $result];
}
if (empty($options['patch'])) { if (empty($options['patch'])) {
// 不是批量验证则返回 // 不是批量验证则返回
return; return;
@@ -1118,10 +1123,11 @@ class Model
return; return;
} }
if ($val instanceof \Closure) { if ($val instanceof \Closure) {
$result = App::invokeFunction($val, [$value, $data]); $result = call_user_func_array($val, [$value, &$data]);
} else { } else {
$rule = isset($val[0]) ? $val[0] : $val; $rule = isset($val[0]) ? $val[0] : $val;
$type = isset($val[1]) ? $val[1] : 'value'; $type = isset($val[1]) ? $val[1] : 'value';
$params = isset($val[2]) ? $val[2] : [];
if ($rule instanceof \Closure) { if ($rule instanceof \Closure) {
$type = 'callback'; $type = 'callback';
} }
@@ -1130,11 +1136,8 @@ class Model
Hook::exec($rule, '', $data); Hook::exec($rule, '', $data);
return; return;
case 'callback': case 'callback':
if (is_array($rule) || (is_string($rule) && strpos($rule, '::'))) { array_unshift($params, $value);
$result = App::invokeMethod($rule, [$value, &$data]); $result = call_user_func_array($rule, $params);
} else {
$result = App::invokeFunction($rule, [$value, &$data]);
}
break; break;
case 'ignore': case 'ignore':
if ($rule === $value) { if ($rule === $value) {
@@ -1177,17 +1180,14 @@ class Model
} }
switch ($type) { switch ($type) {
case 'callback': case 'callback':
if (is_array($rule) || (is_string($rule) && strpos($rule, '::'))) { array_unshift($options, $value);
$result = App::invokeMethod($rule, [$value, &$data]); $result = call_user_func_array($rule, $options);
} else {
$result = App::invokeFunction($rule, [$value, &$data]);
}
break; break;
case 'behavior': case 'behavior':
// 行为验证 // 行为验证
$result = Hook::exec($rule, '', $data); $result = Hook::exec($rule, '', $data);
break; break;
case 'filter': // 使用filter_var验证 case 'filter': // 使用filter_var验证
$result = filter_var($value, is_int($rule) ? $rule : filter_id($rule), $options); $result = filter_var($value, is_int($rule) ? $rule : filter_id($rule), $options);
break; break;
case 'confirm': case 'confirm':
@@ -1198,8 +1198,8 @@ class Model
$range = is_array($rule) ? $rule : explode(',', $rule); $range = is_array($rule) ? $rule : explode(',', $rule);
$result = 'in' == $type ? in_array($value, $range) : !in_array($value, $range); $result = 'in' == $type ? in_array($value, $range) : !in_array($value, $range);
break; break;
case 'between': // 验证是否在某个范围 case 'between':// 验证是否在某个范围
case 'notbetween': // 验证是否不在某个范围 case 'notbetween': // 验证是否不在某个范围
if (is_string($rule)) { if (is_string($rule)) {
$rule = explode(',', $rule); $rule = explode(',', $rule);
} }