Yii2.0是一个高效,安全,快速的PHP开发框架,内置了很多开发时常用的功能。
不过我在开发中也遇到了 一些yii框架的小问题,这里说几个模型验证的问题及解决方案。
1.模型验证时,对于数据表里没有的字段的处理
举例场景:用户注册时,提交的表单数据可能包含手机号,短信验证码,密码,重复密码等,而数据表(user)里只有id,phone(手机号),password(密码)这几个字段。当我们在写模型验证规则时,如果加上了对短信验证码和重复密码的验证,yii2就会报错
public function rules() { return [ /*注册第一步验证信息*/ [['phone', 'password', 're_password', 'smscode'], 'required', 'message'=>'缺少参数', 'on'=>'register_phone'], ['password','string','length'=>[6,20], 'message'=>'密码只可输入数字、字母、字符,6-20位', 'on'=>'register_phone'], ['smscode', 'integer', 'min'=>100000, 'max'=>999999, 'message'=>'验证码格式不正确', 'on'=>'register_phone'], ['re_password', 'compare', 'compareAttribute' => 'password', 'message'=>'两次输入密码不一致', 'on'=>'register_phone'], ['phone', 'match', 'pattern' => '/^1\d{10}$/', 'message'=>'手机号格式不正确', 'on'=>'register_phone'], ['phone', 'unique', 'message' => '手机号已被占用!'], ]; }
解决方案:对于数据表里没有的字段需要在模型里提前声明变量,这样就能解决了。
2.模型验证抛错的问题
如上面的验证规则,在调用validate()方法后,yii会自动根据对应验证规则,验证数据,如果数据验证不通过,会将错误信息保存到模型的Errors,直至验证结束。这也就是说,Yii的模型验证在遇到数据不符合验证规则时,并没有立即抛出错误,而是保存错误信息,继续向下验证。
这对于一些极致追求的程序员,当然不能忍受,这不是在浪费时间,浪费性能吗?
所以,就想解决方法,看能不能在模型验证遇到错误时,立即抛错,而不是继续验证。不过遇到很多坑。
尝试no.1 :尝试在验证规则里,加上 'when' => function ($model) {return !$model->hasErrors();}
不过,这样好像不起作用;
尝试 no.2:网上有人说,重写yii2的内置模型验证方法,虽然我也很喜欢看框架源码,
不过要改动框架源码,还没试过
仔细研究了下这块的框架源码,尝试改动了下,结果那种“牵一发而动全身”,你知道吗?
框架运行都出问题了,
也可能是改错了哈,不过想想现在还是算了,不改源码了。
所以解决办法呢,就是如果真的是强迫症的话,就自己写验证程序,不用框架自带了!
这也勉强算是一种解决办法吧
以后在好好研究下,改下这块的源码吧!