Yii2 Model的一些常用rules规则
yii2 2017-02-10 11:23:21

2.0.36以上版本 rules支持:

PHP Code复制内容到剪贴板
  1. public $array_attribute = ['first''second'];  
  2.   
  3. public function rules()  
  4. {  
  5.     return [  
  6.         ['array_attribute''each''rule' => ['customValidatingMethod']],  
  7.     ];  
  8. }  
  9.   
  10. public function customValidatingMethod($attribute$params$validator$current)  
  11. {  
  12.     // $attribute === 'array_attribute' (as before)  
  13.   
  14.     // now: $this->$attribute === ['first', 'second'] (on every iteration)  
  15.     // previously:  
  16.     // $this->$attribute === 'first' (on first iteration)  
  17.     // $this->$attribute === 'second' (on second iteration)  
  18.   
  19.     // use now $current instead  
  20.     // $current === 'first' (on first iteration)  
  21.     // $current === 'second' (on second iteration)  
  22. }  

 

 

 

 

1、对指定字段,作校验 ,判断是否为数据库中已存在的,如选择分类:

PHP Code复制内容到剪贴板
  1. public function rules()  
  2. {  
  3.     return [  
  4.         [['category_id'], 'required'],  
  5.         [['category_id'], 'setCategory'],  
  6.         ['category_id''exist''targetClass' => Category::className(), 'targetAttribute' => 'id'],  
  7.     ];  
  8. }  
  9.   
  10. public function setCategory($attribute$params)  
  11. {  
  12.     $this->category = Category::find()->where(['id' => $this->$attribute])->select('title')->scalar();  
  13. }  

 

2、自定义检验规则,自定义一个函数,并接收参数,对其返回错误示:

提交以后才会触发验证的

PHP Code复制内容到剪贴板
  1. public function rules()    
  2. {    
  3.     return [    
  4.         [['phone'], 'checkFilterPhone'],    
  5.     ];    
  6. }    
  7.     
  8. public function checkFilterPhone($attribute,$params){  
  9.   
  10.   if(UserModel::findByUsername($this->phone)){  
  11.       $this->addError($attribute'手机号已被注册');  
  12.   }  
  13.   
  14. }  

 

新版写法:

PHP Code复制内容到剪贴板
  1.     public function checkIdNum($attribute,$params,$validator){  
  2.         //$num = $this->attribute->params;  
  3. //        $this->hasErrors()  
  4. //        $this->$attribute  
  5.         $validator->addError($this,$attribute'请输入正确的身份证号!');  
  6.     }  

 

 

提示:打印出Validator::$builtInValidators可以看到被支持的所有validators

去除首尾空白字符

PHP Code复制内容到剪贴板
  1. ['email''trim']  
  2. 或  
  3. ['email''filter''filter' => 'trim']  

 

字段必填

PHP Code复制内容到剪贴板
  1. ['email''required']  

 

赋予默认值

PHP Code复制内容到剪贴板
  1. ['age''default''value' => 18]  

 

字符串长度

PHP Code复制内容到剪贴板
  1. ['email''string''min' => 3, 'max' => 20]  
  2. 或  
  3. ['email''string''length' => [3, 20]]  

 

格式类型验证

PHP Code复制内容到剪贴板
  1. // 整数格式  
  2. ['age''integer']  
  3. // 浮点数格式  
  4. ['salary''double']  
  5. // 数字格式  
  6. ['temperature''number']  
  7. // 布尔格式  
  8. ['isAdmin''boolean']  
  9. // email格式  
  10. ['email''email']  
  11. // 日期格式  
  12. ['birthday''date']  
  13. // URL格式  
  14. ['website''url''defaultScheme' => 'http']  

 

验证码

PHP Code复制内容到剪贴板
  1. ['verificationCode''captcha']  

 

值在数据表中是唯一的

PHP Code复制内容到剪贴板
  1. ['email''unique''targetClass' => '\common\models\Users']  

 

值在数据表中已存在

PHP Code复制内容到剪贴板
  1. ['email''exist',  
  2.     'targetClass' => '\common\models\User',  
  3.     'filter' => ['status' => User::STATUS_ACTIVE],  
  4.     'message' => 'There is no user with such email.'],  

 

PHP Code复制内容到剪贴板
  1. [['name'], 'unique','message'=>'{attribute} : {value}已存在'],  

 

 

检查输入的两个值是否一致

PHP Code复制内容到剪贴板
  1. ['passwordRepeat''required'// 必须要加上这一句  
  2. ['passwordRepeat''compare''compareAttribute' => 'password''operator' => '===']  

 

数值范围检查

PHP Code复制内容到剪贴板
  1. ['age''compare''compareValue' => 30, 'operator' => '>=']  

 

PHP Code复制内容到剪贴板
  1. ['level''in''range' => [1, 2, 3]]  

 

使用自定义函数过滤

PHP Code复制内容到剪贴板
  1. ['email''filter''filter' => function($value) {  
  2.     // 在此处标准化输入的email  
  3.     return strtolower($value);  
  4. }]  

 

文件上传

PHP Code复制内容到剪贴板
  1. ['textFile''file''extensions' => ['txt''rtf''doc'], 'maxSize' => 1024 * 1024 * 1024]  

 

图片上传

PHP Code复制内容到剪贴板
  1. ['avatar''image''extensions' => ['png''jpg'],  
  2.     'minWidth' => 100, 'maxWidth' => 1000,  
  3.     'minHeight' => 100, 'maxHeight' => 1000,  
  4. ]  

 

使用正则表达式

PHP Code复制内容到剪贴板
  1. ['username''match''pattern' => '/^[a-z]\w*$/i']  

 

 

PHP Code复制内容到剪贴板
  1. [['title''content''titlepic'], 'safe']  

 

PHP Code复制内容到剪贴板
  1. [['zcode','is_default','type','phone_area','phone','zcode','phone_ext','mobile'],'match','pattern'=>'/^[0-9]+$/','message' => '{attribute} 必须为数字'],  
  2. ['street''string''max' => 30],  
  3. ['mobile''string''max' => 11,'min'=>11,'tooLong'=>'手机号格式为11位的数字'],  
  4. [['phone_ext','phone_area'], 'string''max' => 4],  
  5. [['phone'], 'string''max' => 10,'min'],  
  6. ['zcode','string','max'=>6],  
  7.   
  8.   
  9. //必须填写  
  10. array('email, username, password,agree,verifyPassword,verifyCode''required'),  
  11.   
  12. //检查用户名是否重复  
  13. array('email''unique''message' => '用户名已占用'),  
  14.   
  15.   
  16. //用户输入最大的字符限制  
  17. array('email, username''length''max' => 64),  
  18.   
  19. //限制用户最小长度和最大长度  
  20. array('username''length''max' => 7, 'min' => 2, 'tooLong' => '用户名请输入长度为4-14个字符''tooShort' => '用户名请输入长度为2-7个字'),  
  21.   
  22. //限制密码最小长度和最大长度  
  23. array('password''length''max' => 22, 'min' => 6, 'tooLong' => '密码请输入长度为6-22位字符''tooShort' => '密码请输入长度为6-22位字符'),  
  24.   
  25. //判断用户输入的是否是邮件  
  26. array('email''email''message' => '邮箱格式错误'),  
  27.   
  28. //检查用户输入的密码是否是一样的  
  29. array('verifyPassword''compare''compareAttribute' => 'password''message' => '请再输入确认密码'),  
  30.   
  31. //检查用户是否同意协议条款  
  32. array('agree''required''requiredValue' => true, 'message' => '请确认是否同意隐私权协议条款'),  
  33.   
  34. //判断是否是日期格式  
  35. array('created''date''format' => 'yyyy/MM/dd/ HH:mm:ss'),  
  36.   
  37. //判断是否包含输入的字符  
  38. array('superuser''in''range' => array(0, 1)),  
  39.   
  40. //正则验证器:  
  41. array('name''match''pattern' => '/^[a-z0-9\-_]+$/'),  
  42.   
  43. //数字验证器:  
  44. array('id''numerical''min' => 1, 'max' => 10, 'integerOnly' => true),  
  45.   
  46. //类型验证 integer,float,string,array,date,time,datetime  
  47. array('created''type''datetime'),  
  48.   
  49. //文件验证:  
  50. array('filename''file''allowEmpty' => true, 'types' => 'zip, rar, xls, pdf, ppt''tooLarge' => '图片不要超过800K'),  
  51.   
  52. array('url',  
  53.     'file'//定义为file类型  
  54.     'allowEmpty' => true,  
  55.     'types' => 'jpg,png,gif,doc,docx,pdf,xls,xlsx,zip,rar,ppt,pptx'//上传文件的类型  
  56.     'maxSize' => 1024 * 1024 * 10, //上传大小限制,注意不是php.ini中的上传文件大小  
  57.     'tooLarge' => '文件大于10M,上传失败!请上传小于10M的文件!'  
  58. )  

 

 

 

保存之前 / 更新之前 / 插入之前 / 更新以后 / 插入以后

Model中可以添加控制指定操作之前先执行一段动作:

PHP Code复制内容到剪贴板
  1. // 在执行save()方法之前(已验证):  
  2. public function beforeSave($insert)  
  3.     {  
  4.         if(parent::beforeSave($insert))  
  5.         {  
  6.             if($this->isNewRecord)  
  7.             {  
  8.                 $this->create_time = time();  
  9.                 $this->publishe_time = time();  
  10.                 $this->user_id = Yii::$app->user->id;  
  11.                 $this->user_name = Yii::$app->user->identity->username;  
  12.                 $this->readed = rand(200,500);  
  13.                 if(emptyempty($this->abstract)){  
  14.                     $this->abstract = $this->abstract?$this->abstract:substr(strip_tags($this->context),0,200);  
  15.                 }  
  16.             }  
  17.             return true;  
  18.         }else{  
  19.             return false;  
  20.         }  
  21.     }  
  22. /**   
  23.      * This is invoked after the record is saved.   
  24.      */    
  25.     public function afterSave($insert$changedAttributes)    
  26.     {    
  27.         parent::afterSave($insert$changedAttributes);    
  28.         Tag::updateFrequency($this->_oldTags, $this->tags,strtolower($this->getClassName()));    
  29.     }    
  30.   
  31.     public function afterDelete() {  
  32.         // delete dependencies  
  33.         Yii::$app->db->createCommand("DELETE FROM {{%banner_image}} WHERE banner_id=".$this->cacheId)->execute();  
  34.         parent::afterDelete();  
  35.     }  

 

PHP Code复制内容到剪贴板
  1. public function afterFind()  
  2. {  
  3.     parent::afterFind();  
  4.     if ($this->type == 'image' && !empty($this->value)) {  
  5.         $this->value = Attachment::findOne($this->value);  
  6.     }  
  7. }  

 

 

PHP Code复制内容到剪贴板
  1. ['titlepic''filter''filter' => function ($val) {  
  2.                 return $val['id'];  
  3.             }, 'skipOnEmpty' => true],  
  4.   
  5. //titlepic使用的文件上传,传过来是一段数组,取其中的id为值 ,skipOnEmpty 跳过空值处理  

Note: 对于绝大多数验证器而言,若其 yii\base\Validator::skipOnEmpty 属性为默认值 true,则它们不会对空值进行任何处理。也就是当他们的关联特性接收到空值时,相关验证会被直接略过。在 核心验证器 之中,只有 captcha(验证码),default(默认值), filter(滤镜),required(必填),以及 trim(去首尾空格),这几个验证器会处理空输入。 

 

 核心验证器 / filter(滤镜):

PHP Code复制内容到剪贴板
  1. [  
  2.     // trim 掉 "username" 和 "email" 输入  
  3.     [['username''email'], 'filter''filter' => 'trim''skipOnArray' => true],  
  4.   
  5.     // 标准化 "phone" 输入  
  6.     ['phone''filter''filter' => function ($value) {  
  7.         // 在此处标准化输入的电话号码  
  8.         return $value;  
  9.     }],  
  10. ]  

该验证器并不进行数据验证。而是,给输入值应用一个滤镜, 并在检验过程之后把它赋值回特性变量。

  • filter:用于定义滤镜的 PHP 回调函数。可以为全局函数名,匿名函数,或其他。 该函数的样式必须是 function ($value) { return $newValue; }。该属性不能省略,必须设置。
  • skipOnArray:是否在输入值为数组时跳过滤镜。默认为 false。 请注意如果滤镜不能处理数组输入,你就应该把该属性设为 true。 否则可能会导致 PHP Error 的发生。

技巧:如果你只是想要用 trim 处理下输入值,你可以直接用 trim 验证器的。

Tip: There are many PHP functions that have the signature expected for the filter callback. For example to apply type casting (using e.g. intvalboolval, ...) to ensure a specific type for an attribute, you can simply specify the function names of the filter without the need to wrap them in a closure:

['property', 'filter', 'filter' => 'boolval'], ['property', 'filter', 'filter' => 'intval'],

单独view页面中加验证 

JavaScript Code复制内容到剪贴板
  1. <script>  
  2.     var NowTime = "<?=date('Y-m-d H:i:s')?>";  
  3.     jQuery(document).ready(function () {  
  4.         jQuery('#w0').yiiActiveForm([  
  5.             {  
  6.                 "id""plan-plan_et",  
  7.                 "name""plan_et",  
  8.                 "container"".field-plan-plan_et",  
  9.                 "input""#plan-plan_et",  
  10.                 "validate"function (attribute, value, messages, deferred, $form) {  
  11.                     yii.validation.required(value, messages, {"message""结束时间不能为空。"});  
  12.                 }  
  13.             },  
  14.             {  
  15.                 "id""plan-plan_bt",  
  16.                 "name""plan_bt",  
  17.                 "container"".field-plan-plan_bt",  
  18.                 "input""#plan-plan_bt",  
  19.                 "validate"function (attribute, value, messages, deferred, $form) {  
  20.                     yii.validation.required(value, messages, {"message""开始时间不能为空。"});  
  21.                 }  
  22.             },  
  23.             {  
  24.                 "id""plan-plan_et",  
  25.                 "name""plan_et",  
  26.                 "container"".field-plan-plan_et",  
  27.                 "input""#plan-plan_et",  
  28.                 "validate"function (attribute, value, messages, deferred, $form) {  
  29.                     var planBt = $("#plan-plan_bt").val();  
  30.                     yii.validation.compare(value, messages, {  
  31.                         "operator"">",  
  32.                         "type""string",  
  33.                         "compareValue": planBt,  
  34.                         "skipOnEmpty": 1,  
  35.                         "message""结束时间 必须大于 开始时间"  
  36.                     });  
  37.                 }  
  38.             }  
  39.         ], []);  
  40.     });  
  41. </script>  

 

 

本文来自于:http://www.yoyo88.cn/study/yii2/76.html

Powered by yoyo苏ICP备15045725号