在Model中找不到validate这个方法,只有$_validate这个受保护的变量
原理:
核心为Model中的魔术方法public function __call($method, $args)
1.连贯操作中$m_users->validate($rules)
2.PHP在Model中找不到validate方法
3.php跳到魔术方法__call,这里$method=方法名(这里就是validate),$args=参数数组(这里只有一个参数$rules,所以$args=array($rules) )
4.进入__call中的第一个if
if (in_array(strtolower($method), $this->methods, true)) {
// 连贯操作的实现
$this->options[strtolower($method)] = $args[0];
return $this;
}
这里赋值了$this->options['validate']=$rules
5.到第4步$m_users->validate($rules)这个操作已经完成,接下来就是create
create中有代码:
// 数据自动验证
if (!$this->autoValidation($data, $type))
return false;
6.数据进入autoValidation函数中,接下来关键的一段代码:
if (!empty($this->options['validate'])) {
$_validate = $this->options['validate'];
unset($this->options['validate']);
} elseif (!empty($this->_validate)) {
$_validate = $this->_validate;
}
这行代码去判断$this->options['validate']有没有东西,然后下面的代码进行验证操作。
下面就不用说多余的了吧!!!!
不过这里有个结论:如果设置了自动验证和动态验证,他会取动态验证的,自动验证的那些规则都会被过滤掉!只能说6666666,你可以在模型继承中设置好自动验证,来确保数据插入的安全性,然后如果哪个实习生在某方法中忘了设置动态验证,也不会影响数据库。
最佳答案
