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 模板高级篇总结
Dec 21 PHP
PHP连接Access数据库的方法小结
Jun 20 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
Feb 13 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
Web程序工作原理详解
Dec 25 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
PHP写的简单数字验证码实例
May 23 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 PHP
PHP底层运行机制与工作原理详解
Jul 31 PHP
Swoole扩展的6种模式深入详解
Mar 04 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_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
Display SQL Server Login Mode
2007/06/21 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
Python查看微信撤回消息代码
2018/06/07 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Django实现跨域的2种方法
2019/07/31 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
python wsgiref源码解析
2021/02/06 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
高中生学习生活的自我评价
2013/10/09 职场文书
公司会计岗位职责
2014/02/13 职场文书
地质灾害防治方案
2014/05/14 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
超市主管竞聘书
2015/09/15 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
MYSQL如何查看进程和kill进程
2022/03/13 MySQL