baiyuxiong 发表于 2010-12-17 21:38:45

让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里控制器与类库的区别主要在于控制器是处理用户请求的接口,而类库不是。其它控制器能做的功能,类库差不多都能搞定,比如调用模型,视图等。

qq237661791 发表于 2014-9-25 11:39:46

puras 发表于 2010-12-17 23:53
我也是按照这种方式实现的。
可是现在有个问题:
这种方式,是扩展现有类,你只能扩展一个


我也遇到了这个问题,发现设计的简单,但是不灵活啊,我直接用MY_Controller里面写两个类,或者用require包含新的文件(针对一个类一个文件的强迫症)

57sy.com(隐身中 发表于 2014-10-29 15:28:39

不过CI的扩展性 不用说强大!!

puras 发表于 2010-12-17 23:53:07

我也是按照这种方式实现的。
可是现在有个问题:
这种方式,是扩展现有类,你只能扩展一个
如果想再写一个Controller类继承你的MY_Controller,还有办法么?

纠结了。

baiyuxiong 发表于 2010-12-19 16:15:52

回复 2# puras


   你把问题搞的好纠结尽量继承一次搞定吧,多次继承就不清楚了

puras 发表于 2010-12-20 08:56:20

回复 3# baiyuxiong

唉。确实很纠结啊。闹腾ing...

昨夜渡轮 发表于 2011-1-4 00:25:32

这一点不如thinkphp,那个在这方面很灵活

Hex 发表于 2011-1-4 11:56:42

回复 5# 昨夜渡轮


    thinkphp 是纯 PHP 5 的框架吧,CI 要兼容 PHP 4,所以 OO 方面并不是太强。并且我觉得完全的 OO 也不是银弹。

昨夜渡轮 发表于 2011-3-5 22:30:05

当然我更喜欢CI:loveliness:

wsluozefeng 发表于 2011-3-19 19:19:35

我照楼主做了,但不行,提示没有定义controller?什么原因,在application下的library是需要手动加入的,该怎么处理??

changeitcn 发表于 2011-3-29 22:01:53

我照楼主做了,但不行,提示没有定义controller?什么原因,在application下的library是需要手动加入的,该 ...
wsluozefeng 发表于 2011-3-19 19:19 http://codeigniter.org.cn/forums/images/common/back.gif


    名字文件不对吧?

etroy 发表于 2011-5-3 10:03:53

不太明白
页: [1] 2
查看完整版本: 让CI控制器可以继承自定义类