注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

唐老鸭的博客

太多的不如意让我们学会了抱怨,却忘记怎么去努力改变现状.

 
 
 

日志

 
 
 
 

Yii框架中验证器的allowEmpty属性(转载)  

2013-01-22 16:42:22|  分类: Yii |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Yii框架自带验证器这个包,提供了一组常见各类属性的验证器。如果使用Gii代码生成工具创建model,会根据数据库字段的属性默认生成一些验 证器的配置。在配置验证器的时候,很多验证器都有以后属性叫做allowEmpty,这个属性的真正逻辑却不是看上去的那个意思。

数据库里的字段,有个属性,叫NULL,就是字段是否允许为空值,allowEmpty听起来跟这个NULL的约束是一样的,但是实际看验证器的代码:

  1.   protected function validateAttribute($object,$attribute)
  2.      {
  3.          $value=$object->$attribute;
  4.          if($this->allowEmpty && $this->isEmpty($value))
  5.              return;
  6.  
  7.          if(function_exists('mb_strlen') && $this->encoding!==false)
  8.              $length=mb_strlen($value,$this->encoding ? $this->encoding : Yii::app()->charset);
  9.          else
  10.              $length=strlen($value);
  11.          if($this->min!==null && $length<$this->min)
  12.          {
  13.              $message=$this->tooShort!==null?$this->tooShort:Yii::t('yii','{attribute} is too short (minimum is {min} characters).');
  14.              $this->addError($object,$attribute,$message,array('{min}'=>$this->min));
  15.          }
  16.          if($this->max!==null && $length>$this->max)
  17.          {
  18.              $message=$this->tooLong!==null?$this->tooLong:Yii::t('yii','{attribute} is too long (maximum is {max} characters).');
  19.              $this->addError($object,$attribute,$message,array('{max}'=>$this->max));
  20.          }
  21.          if($this->is!==null && $length!==$this->is)
  22.          {
  23.              $message=$this->message!==null?$this->message:Yii::t('yii','{attribute} is of the wrong length (should be {length} characters).');
  24.              $this->addError($object,$attribute,$message,array('{length}'=>$this->is));
  25.          }
  26.      }
  27.  ?>

来看其中一个细节:

  1.   if($this->allowEmpty && $this->isEmpty($value)) return;
  2.  ?>

这一行什么意思,如果被验证属性为空,就认为完全合法,立刻返回,但是如果allowEmpty为false的话,就要通过函数后续的所有验证条 件。那么对于一个传入的空值来说,allowEmpty无论是true还是false,极有可能都不会报错,上面节选的验证器是 StringValidator,如果我没有设定min的值,那么一个空串在allowEmpty为false的情况下,还是不会报任何错误的。

如果希望一个属性值不能为空,最好还是用RequiredValidator来验证,allowEmpty是不靠谱的,建议一般就采取 allowEmpty的默认值true,可以节省几次判断。然后不要中了Yii的这个小陷阱噢~~希望Yii的后续版本可以让这个功能显得更加自然一点, 不要让我猜谜语。

  评论这张
 
阅读(254)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018