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设计模式 Observer(观察者模式)
Jun 26 PHP
PHP实现异步调用方法研究与分享
Oct 27 PHP
比较好用的PHP防注入漏洞过滤函数代码
Apr 11 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 PHP
CI框架简单邮件发送类实例
May 18 PHP
php实现的http请求封装示例
Nov 08 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP类的自动加载机制实现方法分析
Jan 10 PHP
PHP 构造函数和析构函数原理与用法分析
Apr 21 PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 14 PHP
PHP解决高并发的优化方案实例
Dec 10 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
yii分页组件用法实例分析
2015/12/28 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
小程序实现密码输入框
2020/11/16 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
Python字典操作简明总结
2015/04/13 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
python中threading开启关闭线程操作
2020/05/02 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
金融专业个人的自我评价
2013/10/18 职场文书
赡养老人协议书
2014/04/21 职场文书
机动车登记业务委托书
2014/10/08 职场文书
学前班语言教学计划
2015/01/20 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
幽默导游词开场白
2015/05/29 职场文书
四大名著读书笔记
2015/06/25 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
实用求职信模板范文
2019/05/13 职场文书