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

[模型] 一个基于Hex-HMVC的模型扩展

[复制链接]
发表于 2012-10-30 01:21:59 | 显示全部楼层 |阅读模式
首先这个需求是怎样产生的

我发觉CI扩展hex-HMVC后,模型有点让我模糊,怎衡量模型放在相应modules/models下还是放app目录/models下?比如模块1中要调用user模型的get_all方法获取所有用户数据 模块2也要获取这些数据 那么若模块1,2的模型中都创建一个user模型实现各自的get_all方法会不会显得没有重用的味道?

hex提示说可以引入模型继承的概念,于是我尝试在hex的基础上进行扩展

主要修改了code/MY_Loader.php文件
343行 加入了
PHP复制代码
 
// 加载模块模块继承的原始模型
// @author paperen
$this->_ci_basemodel( $model );
 
复制代码


1138行
PHP复制代码
 
        /**
         * 加载模块继承的基础模型
         * 若果模型名称是user_module_model代表要加载user_model模型
         * 模块中模型要继承原始模型的名称必须是 模型名称_module_model 这种形式
         * @author paperen
         * @param string $base_model
         */

        private function _ci_basemodel( $base_model ) {
                $module_tag = 'module';
                $tmp_arr = explode( '_', $base_model );
                if ( !in_array( $module_tag, $tmp_arr ) ) return;
                $model_arr = array( );
                foreach ( $tmp_arr as $str ) {
                        if ( $str == $module_tag ) continue;
                        $model_arr[] = $str;
                }
                $model_name = implode( '_', $model_arr );
                if ( empty( $model_name ) ) return;
                $this->model( $model_name );
        }
 
 
复制代码


实现效果
有一个模块叫user
modules/user/controllers/index.php
PHP复制代码
 
<?php
class User_Index_Module extends CI_Module
{
        public function index() {
                // user模型的get_all
                $this->load->model( 'user_model' );
                $this->user_model->get_all();
       
                // 自身的方法test
                $this->load->model( 'user_module_model' );
                $this->user_module_model->test();
               
                // 调用来自user_model中的get_all
                $this->user_module_model->get_all();
        }
}
 
 
复制代码


该模块的models中有其一个模型
modules/user/models/user_module_model.php
PHP复制代码
 
class User_User_Module_model extends User_Model
{
 
        public function test() {
                echo '<p>' . __CLASS__ . ' ' . __FUNCTION__ . '</p>';
        }
 
}
 
 
复制代码


app的模型目录下存在user模型
application/models/user_model.php
PHP复制代码
 
class User_model extends CI_Model
{
 
        public function get_all() {
                echo '<p>' . __CLASS__ . ' ' . __FUNCTION__ . '</p>';
        }
 
}
 
 
复制代码


浏览器访问index.php/module/user/index结果为

  1. User_model get_all
  2. User_User_Module_model test
  3. User_model get_all
复制代码
希望对大家有用

MY_Loader.rar

7.88 KB, 下载次数: 31

评分

参与人数 2威望 +7 收起 理由
Hex + 5 赞一个!
sdink + 2 神马都是浮云

查看全部评分

发表于 2012-10-30 10:27:31 | 显示全部楼层
这个扩展好~
强烈支持~
发表于 2012-10-30 10:57:39 | 显示全部楼层
支持一下。。。。。
 楼主| 发表于 2012-10-30 13:22:39 | 显示全部楼层
Hex 发表于 2012-10-30 10:27
这个扩展好~
强烈支持~

希望我这样扩展没有违背你或者hmvc的设计概念

评分

参与人数 1威望 +5 收起 理由
xyst0524 + 5 很给力!

查看全部评分

发表于 2012-10-30 13:29:51 | 显示全部楼层
paperen 发表于 2012-10-30 13:22
希望我这样扩展没有违背你或者hmvc的设计概念

我做这个 HMVC 的初衷就是为了解耦,让每个module都没有任何耦合。
如果和其他地方有依赖,这就会造成耦合,但是也不能一味追求解耦,还是要具体问题具体分析。

评分

参与人数 1威望 +5 收起 理由
xyst0524 + 5

查看全部评分

 楼主| 发表于 2012-10-30 18:43:05 | 显示全部楼层
Hex 发表于 2012-10-30 13:29
我做这个 HMVC 的初衷就是为了解耦,让每个module都没有任何耦合。
如果和其他地方有依赖,这就会造成耦 ...

嗯 我还有待更深的理解 多谢hex的提醒
发表于 2012-11-5 12:56:58 | 显示全部楼层
看了 ci和doctrine的配置  但是那是老版本的  ci2.x不知道怎么配置  求大哥帮忙  看了几天了  不会  原帖http://codeigniter.org.cn/forums/thread-14727-1-1.html

本版积分规则