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&java(二)
Oct 09 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
php array_walk() 数组函数
Jul 12 PHP
PHP读取xml方法介绍
Jan 12 PHP
php代码书写习惯优化小结
Jun 20 PHP
php除数取整示例
Apr 24 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
php实现上传图片保存到数据库的方法
Feb 11 PHP
php实现复制移动文件的方法
Jul 29 PHP
php批量删除超链接的实现方法
Oct 19 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
Mar 07 PHP
php格式化时间戳
Dec 17 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动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
JavaScript中this详解
2015/09/01 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
ES6扩展运算符用法实例分析
2017/10/31 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python 内置函数complex详解
2016/10/23 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
2016/12/18 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
python中列表和元组的区别
2017/12/18 Python
python取代netcat过程分析
2018/02/10 Python
Python理解递归的方法总结
2019/01/28 Python
python实现猜数字游戏
2020/03/25 Python
安装PyInstaller失败问题解决
2019/12/14 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
关于python的缩进规则的知识点详解
2020/06/22 Python
星空联盟C# .net笔试题
2014/12/05 面试题
井冈山红色之旅感想
2014/10/07 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
六年级作文之自救
2019/12/19 职场文书
python实现商品进销存管理系统
2022/05/30 Python
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python