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 操作文件的一些FAQ总结
Feb 12 PHP
PHP源码之 ext/mysql扩展部分
Jul 17 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
PHP自动重命名文件实现方法
Nov 04 PHP
php中rename函数用法分析
Nov 15 PHP
php使用gzip压缩传输js和css文件的方法
Jul 29 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
php实现等比例不失真缩放上传图片的方法
Nov 14 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
php将字符串转换为数组实例讲解
May 05 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获取某个目录大小的代码
2008/09/10 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
Python字符串切片操作知识详解
2016/03/28 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
python扫描线填充算法详解
2020/02/19 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
求职自荐信格式
2013/12/04 职场文书
法律专业实习鉴定
2013/12/22 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
法学毕业生自我鉴定
2014/01/31 职场文书
调解员先进事迹材料
2014/02/07 职场文书
业务内勤岗位职责
2014/04/30 职场文书
夏季药店促销方案
2014/08/22 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
辩护词范文大全
2015/05/21 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书
HTTP中的Content-type详解
2022/01/18 HTML / CSS