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 zend解密软件绿色版测试可用
Apr 14 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
Apr 26 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
Feb 18 PHP
一个简单的PHP验证码实现代码
May 10 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
Aug 06 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
php保存信息到当前Session的方法
Mar 16 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
tp5框架内使用tp3.2分页的方法分析
May 05 PHP
PHP中strval()函数实例用法
Jun 07 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
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
Laravel5中contracts详解
2015/03/02 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
php微信开发之谷歌测距
2018/06/14 PHP
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
Node.js学习入门
2017/01/03 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
JS实现评价的星星功能
2017/08/20 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
Python文件处理
2016/02/29 Python
如何在Django项目中引入静态文件
2019/07/26 Python
Python简易版图书管理系统
2019/08/12 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
python 安装impala包步骤
2020/03/28 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
大学生暑期实践感言
2014/02/26 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
创建青年文明号材料
2014/05/09 职场文书
nginx优化的六点方法
2021/03/31 Servers
Node.js实现断点续传
2021/06/23 Javascript