关于Yii2.0框架模型验证的几个小问题

2018-09-04 16:18:54 PHP 阅读 (3227) 评论(0)

        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' => '手机号已被占用!'],
                ];
    }

image.png

            解决方案:对于数据表里没有的字段需要在模型里提前声明变量,这样就能解决了。

image.png

    

        2.模型验证抛错的问题

            如上面的验证规则,在调用validate()方法后,yii会自动根据对应验证规则,验证数据,如果数据验证不通过,会将错误信息保存到模型的Errors,直至验证结束。这也就是说,Yii的模型验证在遇到数据不符合验证规则时,并没有立即抛出错误,而是保存错误信息,继续向下验证。

image.png

            这对于一些极致追求的程序员,当然不能忍受,这不是在浪费时间,浪费性能吗?

            所以,就想解决方法,看能不能在模型验证遇到错误时,立即抛错,而不是继续验证。不过遇到很多坑。

      尝试no.1 :尝试在验证规则里,加上 'when' => function ($model) {return !$model->hasErrors();} 

        不过,这样好像不起作用;

      尝试 no.2:网上有人说,重写yii2的内置模型验证方法,虽然我也很喜欢看框架源码,

        不过要改动框架源码,还没试过

        仔细研究了下这块的框架源码,尝试改动了下,结果那种“牵一发而动全身”,你知道吗?

        框架运行都出问题了,

        也可能是改错了哈,不过想想现在还是算了,不改源码了。


        所以解决办法呢,就是如果真的是强迫症的话,就自己写验证程序,不用框架自带了!

        这也勉强算是一种解决办法吧


        以后在好好研究下,改下这块的源码吧!

 


        

评论