使用过YII的人会知道YII使用module实现HMVC(可参见 http://baike.baidu.com/view/3256424.htm)使用相当方便。
因为工作需要我用到了codeigniter(以下简称ci)做开发,想在CI中实现HMVC当然通过修改ci的源码肯定能实现,ci论坛中也讨论了好几种方法,自己寻思着用了一种最简单的方式widget实现了简单的HMVC,当然不是完整意义上的HMVC不过也能适用于一般情况。
上代码,如果工作需要我肯定还会不断完善这样widget的方式
首先,我扩展了ci的控制器
- /**
- * 控制器基类
- * 前台控制器继承MY_Controller
- * 后台控制器继承MY_Admin_Controller,同时MY_Admin_Controller 继承自MY_Controller
- * @author ricky
- * @since 2010/07/23
- * @copyright tusheng
- *
- */
- class MY_Controller extends Controller
- {
- public function MY_Controller()
- {
- parent :: Controller();
- }
- /**
- * load widget class if isset $name and called widget() in controller class
- * @param string $name
- */
- protected function widget($name = '')
- {
- if (isset($name) && $name != '')
- {
- require_once APPPATH.'widgets/'.$name.EXT;
- }
- }
- }
接着创建了widget夹子
widget实现
- <?php
- /**
- * 单例模式实现widget.
- *
- * widget即小组件包含自己的控制器,视图,模型(可以共用普通model)。
- * 通常用来实现各页面都有的公共部分
- *
- * @author ricky
- * @since 2010/12/24 09:00
- */
- class Widget extends MY_Controller
- {
- /**
- * 静态ci对象
- */
- public static $_ci;
- /**
- * 私有构造函数用于实现单例模式
- */
- private function __construct()
- {
- parent::MY_Controller();
- self::$_ci = & get_instance();//php 5.3中self改为static
- }
- /**
- * 获取当前类名
- */
- private static function _getClass()
- {
- return __CLASS__;
- }
- /**
- * 普通控制器方法
- */
- public static function foot()
- {
- /**
- * 开发自己的方法必需包含此两行代码
- */
- $class = self::_getClass();
- $instance = & new $class();//延迟绑定
- $instance->load->model('m_article','article_widget');//notice : 这里load model 如果已在控制器中注意命名空间污染的问题,所以这里使用了'article_widget'而不是'article'
- $category = $instance->article_widget->getArticleCategory();
- if (is_array($category) && !emptyempty($category))
- {
- foreach ($category as $key=>$value)
- {
- $article[$value['id']] = $instance->article_widget->getArticle('1',intval($value['id']));
- }
- }
- $data['article'] = $article;
- $instance->load->view('foot',$data);
- }
- /**
- * left category tree.
- *
- *
- */
- public static function category()
- {
- $class = self::_getClass();
- $instance = & new $class();
- $instance->load->model('m_category','category_widget');
- $data['categoryTree'] = $instance->category_widget->getCategory();
- $instance->load->view('left',$data);
- }
- }
当然继承自MY_Controller 的控制器中需要调用父类的widget方法
- //load widget
- $this->widget('widget');
视图中直接使用
- <?php Widget::foot();?>
最后如果需要参数等可自行修改
转载于:https://blog.51cto.com/rickyliyi/478432