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 daodb插入、更新与删除数据
Mar 19 PHP
最新的php 文件上传模型,支持多文件上传
Aug 13 PHP
PHPMYADMIN 简明安装教程 推荐
Mar 07 PHP
PHP原理之异常机制深入分析
Aug 08 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
浅析php header 跳转
Jun 17 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 PHP
PHP实现获取文件mime类型多种方法解析
May 28 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中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
javascript document.execCommand() 常用解析
2009/12/14 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
python3.6使用pickle序列化class的方法
2018/10/22 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
Python如何实现强制数据类型转换
2019/11/22 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
业务经理的岗位职责
2013/11/16 职场文书
2014年教师节寄语
2014/04/03 职场文书
小学安全工作总结2015
2015/05/18 职场文书
2015年女工委工作总结
2015/07/27 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书