让CI控制器可以继承自定义类
很多操作,比如验证授权等,可能在每个控制器里都需要做,如果重复在不同的控制器里调用验证方法,就显得太过于累赘了。Codeigniter的控制器默认必须继承自Controller,下面的方法可以让你自己定义一个父控制器,然后让所有的控制器都继承这个控制器,这样的话, 一些统一入口的操作,就可以交给这个父控制器了。第一步:在application目录的library下面建立新的文件MY_Controller.php,并加入下面代码:
class MY_Controller extends Controller
{
public function __construct()
{
parent::__construct();
}
public function is_logged_in()
{
$user = $this->session->userdata('user_data');
return isset($user);
}
}
然后在控制器目录下建立一个控制器来进行测试
class X extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
public function do_something()
{
if ($this->is_logged_in())
{
// User is logged in.Do something.
}
}
}
访问X控制器,发现可以调用到my_controller里的方法。
原理解释:
CI系统默认的控制器父类在system/library目录里,在application/library目录里定义的MY_controller其实就是对系统默认控制器类的扩展。
手册上的解释见:
http://codeigniter.org.cn/user_guide/general/core_classes.html
CI里控制器与类库的区别主要在于控制器是处理用户请求的接口,而类库不是。其它控制器能做的功能,类库差不多都能搞定,比如调用模型,视图等。 puras 发表于 2010-12-17 23:53
我也是按照这种方式实现的。
可是现在有个问题:
这种方式,是扩展现有类,你只能扩展一个
我也遇到了这个问题,发现设计的简单,但是不灵活啊,我直接用MY_Controller里面写两个类,或者用require包含新的文件(针对一个类一个文件的强迫症)
不过CI的扩展性 不用说强大!! 我也是按照这种方式实现的。
可是现在有个问题:
这种方式,是扩展现有类,你只能扩展一个
如果想再写一个Controller类继承你的MY_Controller,还有办法么?
纠结了。 回复 2# puras
你把问题搞的好纠结尽量继承一次搞定吧,多次继承就不清楚了 回复 3# baiyuxiong
唉。确实很纠结啊。闹腾ing... 这一点不如thinkphp,那个在这方面很灵活 回复 5# 昨夜渡轮
thinkphp 是纯 PHP 5 的框架吧,CI 要兼容 PHP 4,所以 OO 方面并不是太强。并且我觉得完全的 OO 也不是银弹。 当然我更喜欢CI:loveliness: 我照楼主做了,但不行,提示没有定义controller?什么原因,在application下的library是需要手动加入的,该怎么处理?? 我照楼主做了,但不行,提示没有定义controller?什么原因,在application下的library是需要手动加入的,该 ...
wsluozefeng 发表于 2011-3-19 19:19 http://codeigniter.org.cn/forums/images/common/back.gif
名字文件不对吧? 不太明白
页:
[1]
2