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

[核心代码 Core] [3.0.6]为 CI 增加 HMVC 支持【更新日期:2016.4.25】

    [复制链接]
发表于 2008-12-3 10:13:46 | 显示全部楼层 |阅读模式
HMVC 扩展开源项目地址https://github.com/hex-ci/CodeIgniter-HMVC

先看看什么是 HMVC:http://zh.wikipedia.org/wiki/HMVC

一直感觉 CodeIgniter 缺乏好的 HMVC 架构,而且我个人认为目前的几个 HMVC 第三方类库都不是很好,有的要修改 CI 的源代码,有的要引入新的语法,这都不是我喜欢的方式,所以我自己思考了一个方案,希望大家多多提出宝贵意见。
这个 HMVC 特点就是不修改 CI 源代码,不引入新的语法,完全是利用 CI 强大的扩展机制。

目前的扩展方式是在 application 目录下增加 modules 目录,每个模块有自己的目录,并且模块可以有一级子目录,比如 application/modules/目录/模块名/....;
每个模块都有自己的 MVC 结构,像这样 application/modules/模块名/controllers; application/modules/模块名/models; application/modules/模块名/views
模块类名必须是类似这样的:目录_模块名_控制器名_module
(如:Account_Message_Home_module)
模块名和模块类名不一样,如上例,模块名就是 message,模块名也是模块文件名,如 message.php

在视图中装载模块:
PHP复制代码
$this->load->module('模块名/控制器/方法');
复制代码

这里也可以使用 URL 路由中的默认控制器,默认的方法是 index() 方法,和普通控制器保持一致。
如果要传递参数:
PHP复制代码
$this->load->module('模块名/控制器/方法', array('参数1', '参数2', ...));
复制代码

如果需要返回模块的结果而不想输出到屏幕,可以把第 3 个参数设置为 TRUE:
PHP复制代码
$this->load->module('模块名', array('参数1', '参数2', ...), TRUE);
复制代码


如果需要从 URL 访问某个模块的某个方法,URL 规则是这样的:
http://domain/index.php/module/模块名/控制器/方法

实际上 /module 后面的内容和前面传入 $this->load->module() 中的参数一致。
如果要通过 URL 传递参数,则直接加在 URL 后面:
http://domain/index.php/module/模块名/控制器/方法/参数1/参数2/..../参数n

另外,这里的 URI 可以使用路由规则,也就是说什么样的 URL 都可以,只要最后路由成符合上面的规则即可,比如要使用这样的 URL:
http://domain/index.php/m/模块名/控制器/方法

可以在 routers.php 里添加一个路由规则:
PHP复制代码
$route['m/(:any)'] = 'module/$1';
复制代码


如果要在某个模块的视图里生成访问当前模块当前控制器的某方法的 URL,可以在视图里这样写:
PHP复制代码
<?php echo $this->module_url('要访问的方法名/参数1/..../参数n'); ?>
复制代码

如果要生成当前模块其他控制器的方法的 URL,可以这样:
PHP复制代码
<?php echo $this->module_url('要访问的方法名/参数1/..../参数n', '控制器名'); ?>
复制代码



基本上就是这样,如果大家有不清楚的,我会详细解答。

提供下载压缩包中有控制器、模型、视图和模块的简单例子,并且其中只包含模块所需的代码,不包含 CI 核心代码。

最新代码和例子请到 Github 下载~ https://github.com/hex-ci/CodeIgniter-HMVC


更新记录:
2016.4.25 支持 CodeIgniter 3.0.6
2013.4.18 修复一个在模块中的模型,无法访问当前模块变量的 BUG。感谢 @yzou 报告此 BUG。
2012.4.8 修复一个自动装载类库后,模块中此类库无法使用的 BUG。
2012.2.19 增加对 CodeIgniter 2.1.0 的支持。
2011.8.9 修复从 URL 访问 Module 的时候,autoload 无效的 BUG。感谢 lucky9805 报告此 BUG。
2011.7.28 增加从 URL 访问 Module 的功能。
2011.4.13 修正 autoload 对 module 无效的 BUG,感谢 benfeng 报告此问题!
2011.4.11 支持最新的 CI 2.0.0,完全为 PHP5 重写 HMVC 所有代码。
2011.1.8 支持在控制器里直接载入一个或多个模块;修复在模块里装载类库报错的 BUG;
2010.12.15 支持在控制器中直接装载模块。
2010.8.7  修正一个在 Module 的构造函数中装载 Model 报错的 BUG,感谢 coeus 报告此问题!

module_202.zip

18.7 KB, 下载次数: 456

Module for 2.0.x

module_210.zip

19.42 KB, 下载次数: 582

Module for 2.1.0

module_213.zip

22.16 KB, 下载次数: 474

Module for 2.1.3

评分

参与人数 11威望 +55 收起 理由
Altair + 5 很给力!
南宫云尚 + 5
trynews + 5 很给力!
zhengfeity + 5 赞一个!
hamenui + 5 神马都是浮云

查看全部评分

发表于 2014-4-23 10:29:16 | 显示全部楼层
本帖最后由 wuyichao36 于 2014-4-23 10:31 编辑
Hex 发表于 2014-4-22 18:42
我看了一下,你的代码是怎么写的,贴全了,可能是你的使用有问题。

role  文件夹下面 controllers 下面的 home_made.php

PHP复制代码
<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
class Role_Home_Made_module extends CI_Module {
 
        /**
         * 构造函数
         *
         * @return void
         * @author
         **/

        function __construct(){
                parent::__construct();
        }
 
        function index($id=1){
               
                $this->output->cache(1/30);
       
                $this->load->model('Main_data_model');
                $view['role_list'] = $this->Main_data_model->export($id);
                $view['role_group'] = $this->Main_data_model->directory($id);
 
                $this->load->view('view_test',$view);
        }
}
复制代码



role  文件夹下面 controllers 下面的 main_data_model.php

PHP复制代码
 
<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
 
class Role_Main_data_model extends CI_Model {
 
        function __construct(){
                parent::__construct();
        }
 
        function export($parentid){
               
                $this->db->from('admin_active');  
                $this->db->where('parent_id',$parentid);
                         
                $this->db->order_by('parent_id asc,orderid asc');
                $query = $this->db->get();
                         
                return $query->result_array();
        }
 
        function directory($parentid){
               
                $this->db->select('action_code');
                $this->db->from('admin_active');
                $this->db->where('id',$parentid);
                         
                $query = $this->db->get();
                         
                return $query->row_array();
        }
 
 
}
 
 
 
复制代码





role  文件夹下面 controllers 下面的 view_test.php


显示一些信息。。


调用:
<?php $this->load->module('role/home_made',6); ?>



关键我是在5.2下面是没问题啊。  就在 php 5.3 下有这个问题。。。



发表于 2014-10-27 09:42:18 | 显示全部楼层

A PHP Error was encountered

Severity: Warning

Message: call_user_func_array() expects parameter 2 to be array, string given

Filename: core/MY_Loader.php

Line Number: 213

之前在php 5.2下面是正常的。PHP升级后在5.3.28下面出错

http://localhost/codeigniter/index.php/module/latest_articles/latest_articles
这样直接访问是可以的

<?php $this->load->module('latest_articles/latest_articles'); ?>
这样引用了就会出现上面的错误

请问是什么原因?
发表于 2014-4-22 10:18:48 | 显示全部楼层
最近发现你这在 Apache/2.0.63 (Win32) PHP/5.3.5  下面会出错。。

之前在php 5.2多少下面是可以的。很正常。。就在5.3.5下面出错。。




PHP复制代码
A PHP Error was encountered
       
Severity: Warning
Message:  call_user_func_array() expects parameter 2 to be array, integer given</p>
Filename: core/MY_Loader.php
Line Number: 213
复制代码






怎么解决啊。。


在线等
发表于 2008-12-3 10:23:33 | 显示全部楼层
好东西,凑出时间试一下
发表于 2008-12-3 10:27:35 | 显示全部楼层
  抽时间好好研究下Hex的成果
 楼主| 发表于 2008-12-3 10:28:52 | 显示全部楼层
大家多提意见,哪里写的不好,直接提出来,共同学习,共同进步!
发表于 2008-12-3 10:31:02 | 显示全部楼层
学习下先~!~!~!
发表于 2008-12-12 09:10:31 | 显示全部楼层
这个早在关注,不知道是否支持170.
:)
 楼主| 发表于 2008-12-12 10:20:28 | 显示全部楼层
目前还不清楚支持不支持 170,我是在 163 上制作的,回去我测试一下,应该基本没什么问题。
发表于 2008-12-12 13:00:02 | 显示全部楼层
了解,抽空研究,辛苦了
发表于 2008-12-14 15:33:26 | 显示全部楼层
有时间研究一下,谢谢
发表于 2008-12-19 11:29:14 | 显示全部楼层
强大~~顶~~~~

本版积分规则