thinkPHP框架自动填充原理与用法分析


Posted in PHP onApril 03, 2018

本文实例分析了thinkPHP框架自动填充原理与用法。分享给大家供大家参考,具体如下:

thinkphp有一个自动填充字段的方法

填充规则如下

array(
   array(完成字段1,完成规则,[完成条件,附加规则]),
   array(完成字段2,完成规则,[完成条件,附加规则]),
   ......
);

注:研究源码后发现其实还有第4个参数,是给函数或者回调方法传参数用的,参数1默认为该字段值,如:

array('mobile','trim',3,'function',参数2,参数3'),

验证支付动态和静态

静态验证

在模型类里面预先定义好该模型的自动验证规则,在使用create方法后会自动去验证。

以下是官方的例子

1.首先在模型中定义好验证的规则

namespace Home\Model;
use Think\Model;
class UserModel extends Model{
   protected $_auto = array (
     array('status','1'), // 新增的时候把status字段设置为1
     array('password','md5',3,'function') , // 对password字段在新增和编辑的时候使md5函数处理
     array('name','getName',3,'callback'), // 对name字段在新增和编辑的时候回调getName方法
     array('update_time','time',2,'function'), // 对update_time字段在更新的时候写入当前时间戳
   );
}

2.在调用的时候用create方法会自动进行填充

$User = D("User"); // 实例化User对象
if (!$User->create()){ // 创建数据对象
   // 如果创建失败 表示验证没有通过 输出错误提示信息
   exit($User->getError());
}else{
   // 验证通过 写入新增数据
   $User->add();
}

动态验证

以下是官方的例子

$rules = array (
  array('status','1'), // 新增的时候把status字段设置为1
  array('password','md5',3,'function') , // 对password字段在新增和编辑的时候使md5函数处理
  array('update_time','time',2,'function'), // 对update_time字段在更新的时候写入当前时间戳
);
$User = M('User');
$User->auto($rules)->create();
$User->add();

下面是核心的代码分析:

create方法调用后会调用autoOperation方法,方法如下

/**
 * 自动表单处理
 * @access public
 * @param array $data 创建数据
 * @param string $type 创建类型
 * @return mixed
 */
private function autoOperation(&$data,$type) {
  if(!empty($this->options['auto'])) {
    $_auto  =  $this->options['auto'];
    unset($this->options['auto']);
  }elseif(!empty($this->_auto)){
    $_auto  =  $this->_auto;
  }
  // 自动填充
  if(isset($_auto)) {
    foreach ($_auto as $auto){
      // 填充因子定义格式
      // array('field','填充内容','填充条件','附加规则',[额外参数])
      if(empty($auto[2])) $auto[2] = self::MODEL_INSERT; // 默认为新增的时候自动填充
      //这里的判断是关键,$type为当前的操作状态,值为1表示是插入,值为2表示是更新
      //如果当前的$type状态值等于设置的值$auto[2]或者$auto[2]的值为3,代表需要填充
      if( $type == $auto[2] || $auto[2] == self::MODEL_BOTH) {
        if(empty($auto[3])) $auto[3] = 'string';
        switch(trim($auto[3])) {
          case 'function':  // 使用函数进行填充 字段的值作为参数
          case 'callback': // 使用回调方法
            $args = isset($auto[4])?(array)$auto[4]:array();
            if(isset($data[$auto[0]])) {
              array_unshift($args,$data[$auto[0]]);
            }
            if('function'==$auto[3]) {
              $data[$auto[0]] = call_user_func_array($auto[1], $args);
            }else{
              $data[$auto[0]] = call_user_func_array(array(&$this,$auto[1]), $args);
            }
            break;
          case 'field':  // 用其它字段的值进行填充
            $data[$auto[0]] = $data[$auto[1]];
            break;
          case 'ignore': // 为空忽略
            if($auto[1]===$data[$auto[0]])
              unset($data[$auto[0]]);
            break;
          case 'string':
          default: // 默认作为字符串填充
            $data[$auto[0]] = $auto[1];
        }
        if(isset($data[$auto[0]]) && false === $data[$auto[0]] )  unset($data[$auto[0]]);
      }
    }
  }
  return $data;
}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP类中Static方法效率测试代码
Oct 17 PHP
重新封装zend_soap实现http连接安全认证的php代码
Jan 12 PHP
php urlencode()与urldecode()函数字符编码原理详解
Dec 06 PHP
CodeIgniter分页类pagination使用方法示例
Mar 28 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
Oct 03 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
laravel 5.4中实现无限级分类的方法示例
Jul 27 PHP
PHP实现重载的常用方法实例详解
Oct 18 PHP
浅谈PHP实现大流量下抢购方案
Dec 15 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 PHP
PHP重载基础知识回顾
Sep 10 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 #PHP
PHP延迟静态绑定的深入讲解
Apr 02 #PHP
PHP设计模式之装饰器模式定义与用法详解
Apr 02 #PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 #PHP
PHP设计模式之模板方法模式定义与用法详解
Apr 02 #PHP
PHP实现动态获取函数参数的方法示例
Apr 02 #PHP
PHP调用其他文件中的类
Apr 02 #PHP
You might like
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
php 带逗号千位符数字的处理方法
2012/01/10 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
使用Python实现一个简单的项目监控
2015/03/31 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
python 两个数据库postgresql对比
2019/10/21 Python
使用python turtle画高达
2020/01/19 Python
学python爬虫能做什么
2020/07/29 Python
python缩进长度是否统一
2020/08/02 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
详解HTML5新增标签
2017/11/27 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
大学毕业的自我鉴定
2013/10/08 职场文书
授权委托书怎么写
2014/04/03 职场文书
工作评语大全
2014/04/26 职场文书
总账会计岗位职责
2015/04/02 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
家长会感言
2015/08/01 职场文书
HTML基础详解(下)
2021/10/16 HTML / CSS
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android