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 相关文章推荐
使用array mutisort 实现按某字段对数据排序
Jun 18 PHP
thinkphp实现数组分页示例
Apr 13 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
PHP文件上传处理案例分析
Oct 15 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
深入研究PHP中的preg_replace和代码执行
Aug 15 PHP
php微信公众号开发之关键词回复
Oct 20 PHP
PHP+jQuery实现即点即改功能示例
Feb 21 PHP
PHP7内核CGI与FastCGI详解
Apr 14 PHP
详解no input file specified 三种解决方法
Nov 29 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验证码生成类分享
2014/08/21 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
Python基于DES算法加密解密实例
2015/06/03 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
商业项目策划方案
2014/06/05 职场文书
视光学专业自荐信
2014/06/24 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
2015年公司新年寄语
2014/12/08 职场文书
认真学习保证书
2015/02/26 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
民事辩护词范文
2015/05/21 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
java设计模式--原型模式详解
2021/07/21 Java/Android
Python初识逻辑与if语句及用法大全
2021/08/07 Python
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL