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+MSSQL分页的例子
Oct 09 PHP
php 带逗号千位符数字的处理方法
Jan 10 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
ThinkPHP的URL重写问题
Jun 22 PHP
php通过获取头信息判断图片类型的方法
Jun 26 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
Sep 22 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
php之可变函数的实例详解
Sep 13 PHP
php处理多图上传压缩代码功能
Jun 13 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地址
2008/12/20 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
JavaScript的Cookies
2008/01/16 Javascript
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
python解析xml模块封装代码
2014/02/07 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
python之消除前缀重命名的方法
2018/10/21 Python
用django设置session过期时间的方法解析
2019/08/05 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
Python urllib2运行过程原理解析
2020/06/04 Python
python 装饰器重要在哪
2021/02/14 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
函授大学生自我鉴定
2014/02/05 职场文书
2016简单的租房合同范本
2016/03/18 职场文书