[3.0.6]为 CI 增加 HMVC 支持【更新日期:2016.4.25】
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
在视图中装载模块: $this->load->module('模块名/控制器/方法');
这里也可以使用 URL 路由中的默认控制器,默认的方法是 index() 方法,和普通控制器保持一致。
如果要传递参数: $this->load->module('模块名/控制器/方法', array('参数1', '参数2', ...));
如果需要返回模块的结果而不想输出到屏幕,可以把第 3 个参数设置为 TRUE: $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 里添加一个路由规则:
$route['m/(:any)'] = 'module/$1';
如果要在某个模块的视图里生成访问当前模块当前控制器的某方法的 URL,可以在视图里这样写:
<?php echo $this->module_url('要访问的方法名/参数1/..../参数n'); ?>
如果要生成当前模块其他控制器的方法的 URL,可以这样:
<?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 报告此问题!
本帖最后由 wuyichao36 于 2014-4-23 10:31 编辑
Hex 发表于 2014-4-22 18:42
我看了一下,你的代码是怎么写的,贴全了,可能是你的使用有问题。
role文件夹下面 controllers 下面的 home_made.php
<?phpif (!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
<?phpif (!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 下有这个问题。。。
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'); ?>
这样引用了就会出现上面的错误
请问是什么原因? 最近发现你这在 Apache/2.0.63 (Win32) PHP/5.3.5下面会出错。。
之前在php 5.2多少下面是可以的。很正常。。就在5.3.5下面出错。。
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
怎么解决啊。。
在线等
好东西,凑出时间试一下 :victory:抽时间好好研究下Hex的成果 大家多提意见,哪里写的不好,直接提出来,共同学习,共同进步! 学习下先~!~!~! 这个早在关注,不知道是否支持170.
:) 目前还不清楚支持不支持 170,我是在 163 上制作的,回去我测试一下,应该基本没什么问题。 了解,抽空研究,辛苦了 有时间研究一下,谢谢 强大~~顶~~~~