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 printf输出格式使用说明
Dec 05 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
Jul 15 PHP
PHP计算指定日期所在周的开始和结束日期的方法
Mar 24 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
PHP生成条形码大揭秘
Sep 24 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
php微信开发之关注事件
Jun 14 PHP
PHP等比例压缩图片的实例代码
Jul 26 PHP
PHP连续签到功能实现方法详解
Dec 04 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 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
php获取网页内容方法总结
2008/12/04 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
Python导入oracle数据的方法
2015/07/10 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
中国好声音广告词
2014/03/18 职场文书
家长会欢迎标语
2014/06/24 职场文书
2015高考寄语集锦
2015/02/27 职场文书
美容院管理规章制度
2015/08/05 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书