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

[优化] HMVC最大的缺陷!

  [复制链接]
发表于 2010-3-20 10:12:03 | 显示全部楼层 |阅读模式
HMVC模块化编程,可以提高代码重用。但是用了HMVC相当于在一个页面中,调用了几个控制器。而这些控制器间没办法共享数据。结果是:同一个页面中的几个模块间用到相同的数据时,都需要单独去数据库取。

以上论调,大家来讨论一下,是不是这样?
发表于 2010-5-6 12:24:46 | 显示全部楼层
数据共享,可以用静态类特有的机制,将数据注册到静态类当中。
PHP复制代码
class regist
{
  public $date;
  public function set($name,$value){ self::$data[$name]=$value}
  public function get($name){return self::$data[$mame];}
}
复制代码

全局应用,然后存储数据regist::set("aa","bb");
拿数据regist::get("aa")可以在任何类中穿行,畅通无阻。
代码现写,没有测试。
只有想不到,没有做不到, 模式是个壳子,灵活是关键,目的是关键

评分

参与人数 2威望 +4 收起 理由
Hex + 2 我很赞同
saturn + 2 赞同

查看全部评分

发表于 2017-1-16 21:14:58 | 显示全部楼层
多控制器调用时脑残的做法,也可能有人会说在V中调用某一个控制器之类的,你可以使用Model来规避,或者我建议使用CSMV这种逻辑,通过一种service层来处理业务逻辑和定制钩子之类的。www.icvio.com,这个项目就是用这种逻辑开发的项目
发表于 2017-10-2 12:14:43 | 显示全部楼层
ihymk 发表于 2010-5-6 12:24
数据共享,可以用静态类特有的机制,将数据注册到静态类当中。

全局应用,然后存储数据regist::set("aa", ...

数据放到内存里了,这个应该可以实现数据缓存,减轻db压力
发表于 2010-4-7 23:37:56 | 显示全部楼层
HMVC 一个页面只有一个控制器,但是可以多个 model。Model 返回的数据可以在控制器里共用,所以你说的问题也就不是问题了:)
发表于 2010-4-8 19:05:16 | 显示全部楼层
HMVC 可以实现模块之间共享数据吧,只要有这个机制就可以了。
 楼主| 发表于 2010-5-2 20:31:59 | 显示全部楼层
回复 2# BruceWolf


   不是这样的吧?我一个页面,调用了多个module的话,不就有多个控制器吗?这些控制器间数据怎么共享?
 楼主| 发表于 2010-5-2 20:32:12 | 显示全部楼层
回复 3# Hex


   怎么实现呢?
发表于 2010-5-2 22:02:56 | 显示全部楼层
回复  Hex


   怎么实现呢?
baiyuxiong 发表于 2010-5-2 20:32



    最简单,全局变量总可以做到吧?呵呵
发表于 2012-2-7 09:28:46 | 显示全部楼层

想法大大的好
发表于 2012-3-6 13:06:21 | 显示全部楼层
想法大大的好
发表于 2012-3-9 13:19:49 | 显示全部楼层
本帖最后由 paperen 于 2012-3-9 13:20 编辑

我也有一个想法,扩展CI的DB实现查询缓存(或者可以这么叫),而不用像ihymk那样手动set与get

PHP复制代码
 
$user = $db->select('id,email,username')->from('user')->where('username', 'paperen')->get()->row_array();
 
复制代码

时将会在DB实例内部进行登记,比方记录到一个数组中
PHP复制代码
 
$query_cache = array(
'select id,email,username from user where username="paperen"' => 数据
)
 
复制代码

那么在同一个页面加载过程中,如果其他地方(模块)也使用 $db->select('id,email,username')->from('user')->where('username', 'paperen')->get()->row_array(); 匹配一下缓存数组是否有相同键值,有就不用再送sql去数据库了

当然只是在select的时候才会记录,但……这样的数组索引好像有点说不过去

本版积分规则