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模板,主要想体现一下思路
Dec 25 PHP
PHP开发的一些注意点总结
Oct 12 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
Jul 03 PHP
php调用MySQL存储过程的方法集合(推荐)
Jul 03 PHP
php使用mkdir创建多级目录入门例子
May 10 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
Nov 28 PHP
php创建session的方法实例详解
Jan 27 PHP
php构造函数的继承方法
Feb 09 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
PHP封装的mysqli数据库操作类示例
Feb 16 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 PHP
Laravel 前端资源配置教程
Oct 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
一个用php3编写的简单计数器
2006/10/09 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
python实现中文分词FMM算法实例
2015/07/10 Python
python实现树形打印目录结构
2018/03/29 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
python实现决策树分类
2018/08/30 Python
python dict 相同key 合并value的实例
2019/01/21 Python
python面向对象 反射原理解析
2019/08/12 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Django REST framwork的权限验证实例
2020/04/02 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
机电专业大学生求职信
2013/10/04 职场文书
制作部班长职位说明书
2014/02/26 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
2015年教师国培感言
2015/08/01 职场文书
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers