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 多进程 解决难题
Jun 22 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
php实现向javascript传递数组的方法
Jul 27 PHP
PHPStrom中实用的功能和快捷键大全
Sep 23 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
Mar 03 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
PHP与Web页面的交互示例详解二
Aug 04 PHP
详解thinkphp的Auth类认证
May 28 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
php的常量和变量实例详解
2017/06/27 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
对python3新增的byte类型详解
2018/12/04 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
函授毕业自我鉴定
2013/12/19 职场文书
开业庆典策划方案
2014/02/18 职场文书
毕业生自荐信如何写
2014/03/24 职场文书
六年级学生评语
2014/04/22 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
Java使用Unsafe类的示例详解
2021/09/25 Java/Android