非常严重:Model单例模式导致框架的一个bug

浏览:765 发布日期:2014/08/21
3.1.3 - 致命 - 未处理
场景:实例化一个带有_validate属性(自动验证)的Model,当调用create方法时,有验证规则没有验证通过,于是对不通过的元素进行默认值的设置后再调用create方法,此时还是会显示验证不通过。
分析:在autoValidation($data,$type)方法中有以下代码if(!empty($this->error)) return false;由于默认通过D或M方法实例化时是单例,如果有一次执行create方法验证不通过,那么在对象中error就永远会有值,这就会导致不管如何修改数组,永远都不可能验证通过。
引申问题:在实际应用中,如果验证不通过,一般就会返回到界面让用户进行处理。但这种单例模式很可能带来其它潜在问题。特别是如果大量框架级的逻辑如果要用到属性,而这些属性由于带有上一次调用保留下来的数据时,很可能就会导致数据出现问题。
建议解决方案:
1、在D和M方法中增加参数,提供强制创建一个新对象的机制。
2、在调用create这些方法时,把那些不是由用户创建的、非固定的属性删除掉,从数据层面让这个单例看起来就是一个新的对象。

下面是我测试的具体代码:protected $_validate = array(
             array('name','require','name cannot be empty!'), 
$userModel = D('User'); 
$data5['name']=''; 
$result = $userModel->create($data5);
$userInfo['name']='name1111'; 
$result = $userModel->create($userInfo);
最后一行代码永远不会通过
评论(
后面还有条评论,点击查看>>