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脚本数据库功能详解(下)
Oct 09 PHP
PHP 开源框架22个简单简介
Aug 24 PHP
PHP游戏编程25个脚本代码
Feb 08 PHP
解析PHP中常见的mongodb查询操作
Jun 20 PHP
php目录操作实例代码
Feb 21 PHP
yii2简单使用less代替css示例
Mar 10 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
php实现解析xml并生成sql语句的方法
Feb 03 PHP
PDO::query讲解
Jan 29 PHP
Laravel框架自定义验证过程实例分析
Feb 01 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 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像数组一样存取和修改字符串字符
2014/03/21 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
Python遍历目录的4种方法实例介绍
2015/04/13 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
Python魔法方法详解
2019/02/13 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
python中Mako库实例用法
2020/12/31 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
学校后勤人员职责
2013/12/27 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
分居协议书范本
2014/11/03 职场文书
2014年法务工作总结
2014/12/11 职场文书
微信早安问候语
2015/11/10 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书