作者tkdmaf (皮皮快跑)
看板PHP
标题[心得] Codeigniter 2.0使用HMVC的二点注意。
时间Wed Oct 19 17:17:56 2011
最近换到新工作环境,就马上遇到CI 2.0配合HMVC(外挂)。
结果用没几天就直接撞到了二个问题。
第一个:MODEL里面的DB失效。
这看起来像是设计者把DB从MODEL里面移出来,变成必须先宣告:
$this->load->database();
或是在autoload中的libraries事先载入database类别。
为了解除原本习惯的困扰我是直接放在autoload去跑了。
第二个:get_instance()无法取得controller的属性和方法,但是却可以放入属性。
这个就是这二天遇到的问题,get_instance()说真的我还挺常使用的。
其实这个问题主要是出在使用HMVC时,载入的物件类别并不是CI_Controller
像我遇到的情形是使用者是采用「自订名称_Controller」
而get_instance()指向的目标是CI_Controller而非自订的CONTROLLER
解决方法是:
找到你的application/core/MY_Controller.php
当中把你要用的自行定义的CONTROLLER改成如下:
class 自订名称_Controller extends MY_Controller {
private static $instance;
public function __construct()
{
parent::__construct();
self::$instance =& $this;
}
public static function &get_instance()
{
return self::$instance;
}
}
在system/core/Codeigniter.php这只档案中找到215行开始的
function &get_instance()
{
return CI_Controller::get_instance();
}
然後你有二种做法可以选择。
第一个:
改成:
function &get_instance($controller = 'CI_Controller')
{
return $controller::get_instance();
}
那使用方法就是:
$CI = &get_instance('自订名称_Controller');
不过想必每次都这样打有点小麻烦吧!
所以另一个方法就是在上面未改的get_instance()的程式码之後加上这样:
function &my_instance(){
return 自订名称_Controller::get_instance();
}
而使用方法就是:
$CI = &my_instance();
这边有一点要强调。
你不能把&my_instance()写在有autoload的类别的建构式。
这是因为在autoload时,你的自订controller根本还没被载入。
一但你使用就会告诉你类别不存在。
额外说明:&get_instance()在HMVC中无法取得自订CONTROLLER的方法和属性,但为什麽
却可以把属性塞进自订CONTROLLER?仔细想一下自订CONTROLLER虽然继承自
MY_Controller,而MY_Controller又跑去继承MX_Controller,最终……
MX_Controller继承自原本的CI_Controller。
所以当你把属性塞给CI_Controller的话,其他的子类别就通通继承到了。
但是今天主要是要读取CONTROLLER时,状况会反过来发生父类别并不具备子类别的属性
和方法。导致子类别所发生的改变,无法被父类别识别。
听说官方要出正式的HMVC......
希望能够不要发生这样的问题。
--
音GAME的音符比浊水溪的石头还多。
比森林里的树叶还要繁密。
但我全接的决定比奇莱山还要坚定。
柯拿米.巴莱
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.248.170.93