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 相关文章推荐
require(),include(),require_once()和include_once()区别
Mar 27 PHP
php 删除记录实现代码
Mar 12 PHP
php中转义mysql语句的实现代码
Jun 24 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
PHP基础知识介绍
Sep 17 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
PHP自定义多进制的方法
Nov 03 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
Jun 07 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
详解Laravel服务容器的绑定与解析
Nov 05 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 和 HTML
2006/10/09 PHP
PHP parse_url 一个好用的函数
2009/10/03 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
JS记录用户登录次数实现代码
2014/01/15 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
python记录程序运行时间的三种方法
2017/07/14 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
python实现微信打飞机游戏
2020/03/24 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
喜之郎果冻广告词
2014/03/20 职场文书
英语教师个人工作总结
2015/02/09 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
中学教师读书笔记
2015/07/01 职场文书
车间班组长竞聘书
2015/09/15 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL
Python中的pprint模块
2021/11/27 Python
mysql 生成连续日期及变量赋值
2022/03/20 MySQL