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实现登陆验证码(类似条行码状)
Oct 09 PHP
php不用正则采集速度探究总结
Mar 24 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
深入理解PHP中的Streams工具
Jul 03 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 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 获取当前访问的url文件名的方法小结
2010/02/08 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
js中判断控件是否存在
2010/08/25 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
中科方德软件测试面试题
2016/04/21 面试题
优秀研究生自我鉴定
2013/12/04 职场文书
综合办公室个人的自我评价
2013/12/22 职场文书
怎样写演讲稿
2014/01/04 职场文书
初中英语课后反思
2014/04/25 职场文书
班组长安全工作职责
2014/07/15 职场文书
小学老师对学生的评语
2014/12/29 职场文书
收费员岗位职责
2015/02/14 职场文书
离职告别感言
2015/08/04 职场文书