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调用Twitter的RSS的实现代码
Mar 10 PHP
linux下为php添加curl扩展的方法
Jul 29 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
Nov 10 PHP
php 函数中使用static的说明
Jun 01 PHP
PHP 转义使用详解
Jul 15 PHP
使用PHP静态变量当缓存的方法
Nov 13 PHP
8个PHP程序员常用的功能汇总
Dec 18 PHP
PHP积分兑换接口实例
Feb 09 PHP
php使用Jpgraph绘制饼状图的方法
Jun 10 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
Feb 14 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 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
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
php获取数组中重复数据的两种方法
2013/06/28 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
js function使用心得
2010/05/10 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
python 伯努利分布详解
2020/02/25 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
Java基础面试题
2012/11/02 面试题
产品质量承诺书范文
2014/03/27 职场文书
清洁工个人工作总结
2015/03/05 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
MySQL 覆盖索引的优点
2021/05/19 MySQL