/** * 验证单个字段规则 * @access protected * @param string $field 字段名 * @param mixed $value 字段值 * @param mixed $rules 验证规则 * @param array $data 数据 * @param string $title 字段描述 * @param array $msg 提示信息 * @return mixed */ protected function checkItem($field, $value, $rules, $data, $title = '', $msg = []) { if ($rules instanceof \Closure) { // 匿名函数验证 支持传入当前字段和所有字段两个数据 $result = call_user_func_array($rules, [$value, $data]); } else { // 支持多规则验证 require|in:a,b,c|... 或者 ['require','in'=>'a,b,c',...] if (is_string($rules)) { $rules = explode('|', $rules); } $i = 0; foreach ($rules as $key => $rule) {
if ($rule instanceof \Closure) {
$result = call_user_func_array($rule, [$value, $data]);
} else {
// 验证
if (is_numeric($key)) {
if (strpos($rule, ':')) {
list($type, $rule) = explode(':', $rule, 2);
if (isset($this->alias[$type])) {
// 判断别名
$type = $this->alias[$type];
}
$info = $type;
} elseif (method_exists($this, $rule)) {
$type = $rule;
$info = $rule;
$rule = '';
}else {
$type = 'is';
$info = $rule;
}
} else {
$info = $type = $key;
}
// 如果不是 require 有数据才会行验证
if (0 === strpos($info, 'require') || (!is_null($value) && '' !== $value)) {
// 验证类型
$callback = isset(self::$type[$type]) ? self::$type[$type] : [$this, $type];
// 验证数据
$result = call_user_func_array($callback, [$value, $rule, $data, $field]);
} else {
$result = true;
}
}
if (false === $result) {
// 验证失败 返回错误信息
if (isset($msg[$i])) {
$message = $msg[$i];
if (is_string($message) && strpos($message, '{%') === 0) {
$message = (substr($message, 2, -1));
}
} else {
$message = $this->getRuleMsg($field, $title, $info, $rule);
}
return $message;
} elseif (true !== $result) {
// 返回自定义错误信息
return $result;
}
$i++;
}
}
return true !== $result ? $result : true;
}
我的天 这是啥~
尤其是下面这几行代码 我感觉要是在公司里写类似的 会被别人打死的
if (is_numeric($key)) { if (strpos($rule, ':')) { list($type, $rule) = explode(':', $rule, 2); if (isset($this->alias[$type])) { // 判断别名 $type = $this->alias[$type]; } $info = $type; } elseif (method_exists($this, $rule)) { $type = $rule; $info = $rule; $rule = ''; }else { $type = 'is'; $info = $rule; } } else { $info = $type = $key; }
101
msg7086 2016-12-20 05:25:00 +08:00
@hanzhao @Jakesoft
这两句话本来是完全等价的,不用考虑 $result 的类型。 拆开看: if ($result === true) return true; else return $result; 第一个分支和 return $result 是等价的。 @1762628386 你也要考虑到 TP 本身的年代久远。对一个十年前的框架提出现代的要求,是不是有些太过了。 如果你要现代化的框架,直接用 L 家,或者直接改用 Rails 好了。 |
104
cncqw 2016-12-20 11:13:50 +08:00
thinkphp5 抄袭 laravel5 的,连快速入门文档都是抄的,只是把变量名改了,有一处还把 laravel 的一个函数直接复制过来,然而 thinkphp5 里面根本没有这个函数。
|
106
wujunze 2016-12-20 13:10:03 +08:00
TP 还是国内很用心维护的一个开源框架
|
107
enenaaa 2016-12-20 13:20:20 +08:00
想看看懂 oop 的人是怎么写这个函数的
|
108
surfire91 2016-12-20 20:36:08 +08:00
看了一眼好多歪楼的
|
109
1762628386 OP @enenaaa 很明显 你不懂
|
110
enenaaa 2016-12-21 10:13:04 +08:00
@1762628386 我写的 php 代码不超过 1000 行,不懂是正常的。 就想看懂的人是怎么写的。
|
111
msg7086 2016-12-21 13:58:16 +08:00
@dorentus 十年前的 Rails 用起来也一般般,只不过 Ruby 社区比较偏向集中推一个东西,而不是自己搞十个不同的,所以发展得更快一些。我最近 1 年半都在用 Rails 1.x ,感觉和 4.x 差距还是非常大的,很多地方都做得不太顺滑。
|
112
nbhec2 2016-12-21 14:39:07 +08:00 via Android
你是没见过更牛逼的,有个框架叫 OHSCE ,是做 PHP 物联网工控智能化通信的。是我在找所谓互联网+工控时发现的,整个框架里没有一个类 没有一个命名空间 没有所谓静态,只有变量和,常量,函数三种东西,而且还有一些 GOTO 语句,所以命名都是驼峰很长但不会和其它框架冲撞。你会发现拿市面上任何云云种种的 PHP 通信框架, SOCKET 框架在严谨的 NCS 控制工艺中都会或多或少的引发一些问题,但是唯独它没事。和作者交流过,作者是 C/汇编启蒙的人,你让一个一直做单片机的人写出 OOP 风格的代码是有悖于人家的思考习惯的。不同程序员都有自己的习惯自己的风格,不同的风格都能有顶级运行效果的代码出现,你会发现很多风格的思想都是超然于 OOP 存在的 OOP 只是降低了门槛很大程度上。 OHSCE 的 GIT , github.com/openibc/ohsce
|
114
abc123ccc 2016-12-29 15:10:52 +08:00
又有人在黑 TP 了,搬个凳子过来看热闹。大家继续讨论。我只会 TP3.1
|