paperen 发表于 2012-10-30 01:21:59

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

首先这个需求是怎样产生的

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

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

主要修改了code/MY_Loader.php文件
343行 加入了

// 加载模块模块继承的原始模型
// @author paperen
$this->_ci_basemodel( $model );


1138行

        /**
       * 加载模块继承的基础模型
       * 若果模型名称是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
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

class User_User_Module_model extends User_Model
{

        public function test() {
                echo '<p>' . __CLASS__ . ' ' . __FUNCTION__ . '</p>';
        }

}



app的模型目录下存在user模型
application/models/user_model.php

class User_model extends CI_Model
{

        public function get_all() {
                echo '<p>' . __CLASS__ . ' ' . __FUNCTION__ . '</p>';
        }

}



浏览器访问index.php/module/user/index结果为
User_model get_all
User_User_Module_model test
User_model get_all
希望对大家有用

Hex 发表于 2012-10-30 10:27:31

这个扩展好~
强烈支持~

yeseason 发表于 2012-10-30 10:57:39

支持一下。。。。。

paperen 发表于 2012-10-30 13:22:39

Hex 发表于 2012-10-30 10:27 static/image/common/back.gif
这个扩展好~
强烈支持~

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

Hex 发表于 2012-10-30 13:29:51

paperen 发表于 2012-10-30 13:22 static/image/common/back.gif
希望我这样扩展没有违背你或者hmvc的设计概念

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

paperen 发表于 2012-10-30 18:43:05

Hex 发表于 2012-10-30 13:29 static/image/common/back.gif
我做这个 HMVC 的初衷就是为了解耦,让每个module都没有任何耦合。
如果和其他地方有依赖,这就会造成耦 ...

嗯 我还有待更深的理解 多谢hex的提醒

Mckee 发表于 2012-11-5 12:56:58

看了 ci和doctrine的配置但是那是老版本的ci2.x不知道怎么配置求大哥帮忙看了几天了不会原帖http://codeigniter.org.cn/forums/thread-14727-1-1.html
页: [1]
查看完整版本: 一个基于Hex-HMVC的模型扩展