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一些服务器端特性的配置加强php的安全
Oct 09 PHP
php代码优化及php相关问题总结
Oct 09 PHP
php 函数使用方法与函数定义方法
May 09 PHP
PHP读取文件并可支持远程文件的代码分享
Oct 03 PHP
深入理解php的MySQL连接类
Jun 07 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
如何让搜索引擎抓取AJAX内容解决方案
Aug 25 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
CodeIgniter 完美解决URL含有中文字符串
May 13 PHP
Yii2 GridView实现列表页直接修改数据的方法
May 16 PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 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
使用dump函数,给php加断点测试
2013/06/25 PHP
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
计算机科学系职业生涯规划书
2014/03/08 职场文书
2014年清明节寄语
2014/04/03 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
大学同学会活动方案
2014/08/20 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
SpringBoot快速入门详解
2021/07/21 Java/Android
pandas中对文本类型数据的处理小结
2021/11/01 Python
nginx 添加http_stub_status_module模块
2022/05/25 Servers