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

让CI控制器可以继承自定义类

  [复制链接]
发表于 2010-12-17 21:38:45 | 显示全部楼层 |阅读模式
很多操作,比如验证授权等,可能在每个控制器里都需要做,如果重复在不同的控制器里调用验证方法,就显得太过于累赘了。Codeigniter的控制器默认必须继承自Controller,下面的方法可以让你自己定义一个父控制器,然后让所有的控制器都继承这个控制器,这样的话, 一些统一入口的操作,就可以交给这个父控制器了。
第一步:在application目录的library下面建立新的文件MY_Controller.php,并加入下面代码:


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);
    }
}
 
复制代码



然后在控制器目录下建立一个控制器来进行测试
PHP复制代码
 
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里控制器与类库的区别主要在于控制器是处理用户请求的接口,而类库不是。其它控制器能做的功能,类库差不多都能搞定,比如调用模型,视图等。
发表于 2014-9-25 11:39:46 | 显示全部楼层
puras 发表于 2010-12-17 23:53
我也是按照这种方式实现的。
可是现在有个问题:
这种方式,是扩展现有类,你只能扩展一个

我也遇到了这个问题,发现设计的简单,但是不灵活啊,我直接用MY_Controller里面写两个类,或者用require包含新的文件(针对一个类一个文件的强迫症)
发表于 2014-10-29 15:28:39 | 显示全部楼层
不过CI的扩展性 不用说强大!!
发表于 2010-12-17 23:53:07 | 显示全部楼层
我也是按照这种方式实现的。
可是现在有个问题:
这种方式,是扩展现有类,你只能扩展一个
如果想再写一个Controller类继承你的MY_Controller,还有办法么?

纠结了。
 楼主| 发表于 2010-12-19 16:15:52 | 显示全部楼层
回复 2# puras


   你把问题搞的好纠结尽量继承一次搞定吧,多次继承就不清楚了
发表于 2010-12-20 08:56:20 | 显示全部楼层
回复 3# baiyuxiong

唉。确实很纠结啊。闹腾ing...
发表于 2011-1-4 00:25:32 | 显示全部楼层
这一点不如thinkphp,那个在这方面很灵活
发表于 2011-1-4 11:56:42 | 显示全部楼层
回复 5# 昨夜渡轮


    thinkphp 是纯 PHP 5 的框架吧,CI 要兼容 PHP 4,所以 OO 方面并不是太强。并且我觉得完全的 OO 也不是银弹。
发表于 2011-3-5 22:30:05 | 显示全部楼层
当然我更喜欢CI
发表于 2011-3-19 19:19:35 | 显示全部楼层
我照楼主做了,但不行,提示没有定义controller?什么原因,在application下的library是需要手动加入的,该怎么处理??
发表于 2011-3-29 22:01:53 | 显示全部楼层
我照楼主做了,但不行,提示没有定义controller?什么原因,在application下的library是需要手动加入的,该 ...
wsluozefeng 发表于 2011-3-19 19:19



    名字文件不对吧?
发表于 2011-5-3 10:03:53 | 显示全部楼层
不太明白

本版积分规则