用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2422|回复: 3
收起左侧

[模型] 让CI变成VC架构吧!

[复制链接]
发表于 2015-6-30 11:32:29 | 显示全部楼层 |阅读模式
本帖最后由 ★わ浪漫少帅 于 2015-6-30 12:15 编辑

我想有些童鞋经常会因为在Codeigniter中写一些重复的model而烦扰吧,或者这些model只是为了跟数据库打交道而写,因为Codeigniter是一个MVC架构,如果在Controller中就能通过一个方法自动加载想要的model而无需在models文件夹写model那岂不是方便吗?因此我将Codeigniter的MVC架构改成了VC架构,接下来我将详细讲解过程:

第一步:这也是核心步骤,在system/core/Controller.php添加关键的1个函数:
PHP复制代码
function model($class, $conditions = array())
    {
        if ( ! class_exists('CI_Model'))
        {
          load_class('Model', 'core');
        }
        $model = ucfirst($class);
        if(file_exists(FCPATH.APPPATH.'models/'.$model.'_model'.EXT)){                        
            $model = $model . '_model';
            $this->load->model($model);
            return $this->$model;
        }
        if(class_exists($class)){
            return new $class();
        }
        $base_model = $this->config->item('default_base_model');
        $base_model = empty($base_model) ? ' extends CI_Model' : ' extends '. $base_model;
        $db = isset($conditions['db']) ? $conditions['db'] : 'default';
        $id = isset($conditions['id']) ? $conditions['id'] : 'id';
            $tmp_class =
            <<<EOT
            class {$model}{$base_model}{
                    public function __construct() {
                            \$this->_db = '{$db}';
                            \$this->primary_key = '{$id}';
                            parent::__construct();
                    }
            }
EOT
;
        eval($tmp_class);
        return new $model();
    }        
复制代码

第二步:在application/config/config.php中最后一行加入一句配置参数:
PHP复制代码
$config['default_base_model'] = 'MY_Model';
复制代码


如果有在core中重构CI Model的话可以在这里写重构的Model名称否则留空

PHP复制代码
Example:
public function test(){
        // 原生的用法
        $test[] = $this->model('users')->query('select * from users')->result_array();                // 使用MY_Model的用法
        $test[] = $this->model('users')->get_all();
        // 默认使用主键和切库只支持MY_Model, MY_Model可以下载以下链接中的附件:http://codeigniter.org.cn/forums ... 950&page=1#pid80690
        $test[] = $this->model('users', array('primary_key' => 'id', 'db' => 'test'))->get_all();
        //    如果你还是在models文件里面建立了user_model.php, 并且里面有一个test方法
        $test[] = $this->model(users')->test();
         var_dump($test);
    }
复制代码

有什么疑问可以在CI群中找我:群qq:256269683 群昵称:Ⅱ、执笔写年华








评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

 楼主| 发表于 2015-6-30 11:42:30 | 显示全部楼层
有什么疑问可以在CI群中找我:
 楼主| 发表于 2015-6-30 11:44:18 | 显示全部楼层
有什么疑问可以在CI群中找我:群qq:256269683 群昵称:Ⅱ、执笔写年华
发表于 2015-6-30 13:50:41 | 显示全部楼层
不太懂意義在哪
autoload 不是可以自動加載 model?

本版积分规则