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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
May 04 PHP
php的大小写敏感问题整理
Dec 29 PHP
解析php常用image图像函数集
Jun 24 PHP
php实现memcache缓存示例讲解
Dec 04 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
php实现读取手机客户端浏览器的类
Jan 09 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
Nov 18 PHP
php轻松实现文件上传功能
Mar 03 PHP
CI框架整合widget(页面格局)的方法
May 17 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
php实现对文件压缩简单的方法
Sep 29 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
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
Javascript Object.extend
2010/05/18 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
Python yield 使用方法浅析
2017/05/20 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
python机器学习实战之K均值聚类
2017/12/20 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
Exception类的常用方法
2012/06/16 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
春节联欢会主持词
2014/03/24 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
入党心得体会
2019/06/20 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers