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的ob_start();控制您的浏览器cache!
Nov 25 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
带密匙的php加密解密示例分享
Jan 29 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
smarty内置函数capture用法分析
Jan 22 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
php结合安卓客户端实现查询交互实例
May 05 PHP
php三种实现多线程类似的方法
Oct 30 PHP
php微信开发接入
Aug 27 PHP
php 自定义错误日志实例详解
Nov 12 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 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+mysql保存和输出文件
2006/10/09 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
JS option location 页面跳转实现代码
2008/12/27 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
iview实现图片上传功能
2020/06/29 Javascript
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
机电一体化应届生求职信范文
2014/01/24 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
初三毕业感言
2015/07/31 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python