IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    thinkphp create add 代码分析

    songlin发表于 2014-10-25 07:06:46
    love 0

    用thinkphp的时候create方法与 add方法是非常通用的了、那么今天顺着thinkphp的流程来看一下这两个方法在thinkphp框架中是怎么运行的
    测试代码:

                public function D(){
    			$test = D('test');
    			if($test->create()){
    				$test->add();
    			}else{
    				exit($test->getError());
    			}
    		}
    

    数据表结构为

    CREATE TABLE `test` (
      `id` int(10) NOT NULL,
      `name` varchar(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    这是一个非常简单的增加操作了、create验证数据信息、add方法增加操作,还有一个form表单也暂且不贴了。

    首先实例化Model

    /**
      +----------------------------------------------------------
     * D函数用于实例化Model 格式 项目://分组/模块
     +----------------------------------------------------------
     * @param string name Model资源地址
      +----------------------------------------------------------
     * @return Model
      +----------------------------------------------------------
     */
    function D($name='') {
        if(empty($name)) return new Model;
        static $_model = array();
        if(isset($_model[$name]))
            return $_model[$name];
        if(strpos($name,'://')) {// 指定项目
            $name   =  str_replace('://','/Model/',$name);
        }else{
            $name   =  C('DEFAULT_APP').'/Model/'.$name;
        }
        import($name.'Model');
        $class   =   basename($name.'Model');
        if(class_exists($class)) {
            $model = new $class();
        }else {
            $model  = new Model(basename($name));
        }
        $_model[$name]  =  $model;
        return $model;
    }
    

    根据传递参数构造路径import后实例化model类、返回model对象
    $test->create(),create代码

     Thinkphp/Lib/Core/Model.class.php
     /**
         +----------------------------------------------------------
         * 创建数据对象 但不保存到数据库
         +----------------------------------------------------------
         * @access public
         +----------------------------------------------------------
         * @param mixed $data 创建数据
         * @param string $type 状态
         +----------------------------------------------------------
         * @return mixed
         +----------------------------------------------------------
         */
         public function create($data='',$type='') {
            // 如果没有传值默认取POST数据、$data为对象则取对象属性作为参数
            if(empty($data)) {
                $data    =   $_POST;
            }elseif(is_object($data)){
                $data   =   get_object_vars($data);
            }
            // 验证数据、空或者不为数组返回false、将最近报错信息赋值
            if(empty($data) || !is_array($data)) {
                $this->error = L('_DATA_TYPE_INVALID_');
                return false;
            }
    
            // 检查字段映射、开启映射则将数据映射、没开启则返回$data
            $data = $this->parseFieldsMap($data,0);
    
            // 状态
            $type = $type?$type:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT);
    
            // 数据自动验证(进行设置的验证规则进行验证、无规则不验证)
            if(!$this->autoValidation($data,$type)) return false;
    
            // 表单令牌验证、开启令牌验证则进行验证
            if(C('TOKEN_ON') && !$this->autoCheckToken($data)) {
                $this->error = L('_TOKEN_ERROR_');
                return false;
            }
    
            // 验证完成生成数据对象
            if($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据
                $vo   =  array();
                foreach ($this->fields as $key=>$name){
                    if(substr($key,0,1)=='_') continue;
                    $val = isset($data[$name])?$data[$name]:null;
                    //保证赋值有效
                    if(!is_null($val)){
                        $vo[$name] = (MAGIC_QUOTES_GPC && is_string($val))?   stripslashes($val)  :  $val;
                    }
                }
            }else{
                $vo   =  $data;
            }
    
            // 创建完成对数据进行自动处理
            $this->autoOperation($vo,$type);
            // 赋值当前数据对象
            $this->data =   $vo;
            // 返回创建的数据以供其他调用
            return $vo;
         }
    

    $test->add();

      Thinkphp/Lib/Core/Model.class.php
      /**
         +----------------------------------------------------------
         * 新增数据
         +----------------------------------------------------------
         * @access public
         +----------------------------------------------------------
         * @param mixed $data 数据
         * @param array $options 表达式
         * @param boolean $replace 是否replace
         +----------------------------------------------------------
         * @return mixed
         +----------------------------------------------------------
         */
        public function add($data='',$options=array(),$replace=false) {
            if(empty($data)) {
                // 没有传递数据,获取当前数据对象的值
                if(!empty($this->data)) {
                    $data    =   $this->data;
                    // 重置数据
                    $this->data = array();
                }else{
                    $this->error = L('_DATA_TYPE_INVALID_');
                    return false;
                }
            }
            // 分析表达式
            $options =  $this->_parseOptions($options);
            // 数据处理
            $data = $this->_facade($data);
            if(false === $this->_before_insert($data,$options)) {
                return false;
            }
            // 写入数据到数据库
            $result = $this->db->insert($data,$options,$replace);
            if(false !== $result ) {
                $insertId   =   $this->getLastInsID();
                if($insertId) {
                    // 自增主键返回插入ID
                    $data[$this->getPk()]  = $insertId;
                    $this->_after_insert($data,$options);
                    return $insertId;
                }
            }
            return $result;
        }
    

    基本的操作位处理数据、插入到数据库、查询最新的插入id、插入id当做键

    文章均属 松林's blog 原创 转载请注明转自 松林's blog

    本文地址 : http://www.songlin51.com/archives/1162.html



沪ICP备19023445号-2号
友情链接