Yii框架表单模型和验证用法


Posted in PHP onMay 20, 2016

本文实例讲述了Yii框架表单模型和验证用法。分享给大家供大家参考,具体如下:

表单模型CFormModel绝大部分继承CModelCModel,由于表模型数据不需要持久化,所以主要在验证操作上。下面以框架脚手架生成的网站登录为例说明表单模型。

//模型中的验证规则
public function rules()
{
  return array(
    array('username, password', 'required'),
    array('rememberMe', 'boolean'),
    array('password', 'authenticate'),
  );
}
$model=new LoginForm;//创建一个登录表单模型
$model->attributes=$_POST['LoginForm'];//传入登录数据
CModel->setAttributes($values,$safeOnly=true)//调用CModel的setter方法
//返回model中relues中定义的安全数据,经过下面的调用流程获取一个验证器集合
//每个验证器由CValidator::createValidator($rule[1],$this,$rule[0],array_slice($rule,2))
CModel->getValidators()
->createValidators()
->rules()
CModel->validate();//遍历验证器执行验证

验证器内部实现

表单模型核心部分在验证上,下面探讨其实现方式。

YII框架中验证以独立组件集合的形式存在,CValidator是所有验证器的基类。还是以登录验证为例。rules方法中包含required、boolean、authenticate三个验证器

public static function createValidator($name,$object,$attributes,$params=array())
{
  if(is_string($attributes))
    $attributes=preg_split('/[\s,]+/',$attributes,-1,PREG_SPLIT_NO_EMPTY);
  if(isset($params['on']))
  {
    if(is_array($params['on']))
      $on=$params['on'];
    else
      $on=preg_split('/[\s,]+/',$params['on'],-1,PREG_SPLIT_NO_EMPTY);
  }
  else
    $on=array();
  if(method_exists($object,$name))
  {
    $validator=new CInlineValidator;
    $validator->attributes=$attributes;
    $validator->method=$name;
    if(isset($params['clientValidate']))
    {
      $validator->clientValidate=$params['clientValidate'];
      unset($params['clientValidate']);
    }
    $validator->params=$params;
    if(isset($params['skipOnError']))
      $validator->skipOnError=$params['skipOnError'];
  }
  else
  {
    $params['attributes']=$attributes;
    if(isset(self::$builtInValidators[$name]))
      $className=Yii::import(self::$builtInValidators[$name],true);
    else
      $className=Yii::import($name,true);
    $validator=new $className;
    foreach($params as $name=>$value)
      $validator->$name=$value;
  }
  $validator->on=empty($on) ? array() : array_combine($on,$on);
  return $validator;
}

创建验证器流程

1、获取属性(array $attributes)和使用场景(array $on)
2、判断验证器是否存在model中,如果存在创建一个内联验证器CInlineValidator,如果不存在,执行第3步
3、如果验证器是框架自带的导入自带验证器,否则导入外部验证器,然后实例化并赋值。

当触发validate()时候,可能产生的错误将被存储在model中,可以通过调用 CModel::getErrors() 和CModel::getError() 提取这些错误信息

PHP 相关文章推荐
一个PHP+MSSQL分页的例子
Oct 09 PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 PHP
PHP调用Webservice实例代码
Jul 29 PHP
php XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
探讨:如何编写PHP扩展
Jun 13 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
Jul 03 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
全新Mac配置PHP开发环境教程
Feb 03 PHP
微信支付开发动态链接Native支付
Jul 12 PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
May 20 #PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 #PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 #PHP
ThinkPHP使用Ueditor的方法详解
May 20 #PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 #PHP
thinkphp3.x中session方法的用法分析
May 20 #PHP
PHP编写登录验证码功能 附调用方法
May 19 #PHP
You might like
Look And Say 序列php实现代码
2011/05/22 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
vue实现扫码功能
2020/01/17 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
Python中文竖排显示的方法
2015/07/28 Python
Python使用gensim计算文档相似性
2016/04/10 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
Python装饰器用法与知识点小结
2020/03/09 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
Cocopanda波兰:购买化妆品、护肤品、护发和香水
2020/05/25 全球购物
网络工程师职业规划
2014/02/10 职场文书
大学生作弊检讨书
2014/09/11 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
涨价通知怎么写
2015/04/23 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
创业计划书之寿司
2019/07/19 职场文书