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 strtotime 函数UNIX时间戳
Jan 14 PHP
php at(@)符号的用法简介
Jul 11 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
php实现json编码的方法
Jul 30 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
PHP中header用法小结
May 23 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
PHP的中使用非缓冲模式查询数据库的方法
Feb 05 PHP
PHP实现文件上传功能实例代码
May 18 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 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
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
php获取淘宝分类id示例
2014/01/16 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
简单实例处理url特殊符号&处理(2种方法)
2013/04/02 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
小程序实现多选框功能
2018/10/30 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
对pandas中to_dict的用法详解
2018/06/05 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
库房主管岗位职责
2013/12/31 职场文书
酒吧创业计划书
2014/01/18 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript