CodeIgniter3 多次扩展核心类

Publish: December 15, 2015 Category: WEB No Comments

大多数应用中Codeigniter(以下简称ci)具有多种类型的页。前端公共页面,后端管理面板,也可能是需要某种特殊权限的页面, 对于这些类型的页面都各自不同的控制器,ci虽然提供了对核心类进行扩展的方法,缺省情况下是在applicationcore文件夹中添加添加MY_前缀的控制器类即可,但是这样页仅仅是做了一次扩展.我们想要的是 Public_Controller Admin_Controller这种形式.

这里有三种解决方案.

  • [方案一]

目前大多数网上的一种实现方式参考
CodeIgniter中对同一个核心类的多次扩展
简单来说就是在MY_Controller.php中写多个类.下面是Codeigniter.php中一段代码:

if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
{
    require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
}

因为Codeigniter.php中只识别以自定义前缀开头的控制器类,所以粗暴的MY_Controller.php这个文件中写两个类这样就可以将自定义的类加载到框架中,注意在继承的时候不要写错父类.
如果觉得在一个文件中写多个类不太好,也可以写到多个文件中,然后修改Codeigniter.php中相应位置添加

require_once(dirname(__FILE__) . ‘/’ . ‘admin_controller.php’);

这样也修改CI后续升级需要单独处理,相当于给自己挖坑.

  • [方案二]

就是只使用这一个扩展核心类,只是在这个扩展的类的构造函数中去判断网址的段,代码如下:

class MY_Controller extends CI_Controller {
    function __construct(){
        parent::__construct();
        if( $this->uri->segment(1) === 'admin' ){
               ...
        }
    }
}

这种方法不够优雅.

  • [方案三]

方案一缺点是代码不够整洁,不符合代码的最佳实践.方案二有显得不够优雅.个人推荐下面这种解决方案.
其实最简单的方式还是使用PHP5自带的__autoload()魔法函数,通过在config.php中最后添加自动加载项,加载配置文件在处理控制器之前,这样可以很好的解决这个问题,同时也不会影响后续的CI版本升级.

function __autoload($class)
{
 if(strpos($class, 'CI_') !== 0)
 {
  @include_once( APPPATH . 'core/'. $class . EXT );
 }
}

现在可以在application/core中自定义多个Controller了.

Tags: codeigniter3, codeigniter多次扩展核心类

Related Posts:

Leave a Comment