扩展CI_Controller

时间:2012-07-29 16:57:08

标签: php oop codeigniter extend

我所要做的就是相当简单:

  • 创建一个扩展CI_Controller的类(让我们说brandNewClass - NOT MY_Controller
  • 创建扩展brandNewClass
  • 的其他控制器

E.g。

class brandNewClass extends CI_Controller {

    public function index()
    {

    }

    public function info()
    {

    }
}

使用like(在/controllers下的文件中):

<?php

class newController extends brandNewClass
{
}

?>

问题是,虽然当我在/application/core下复制文件并将其命名为MY_Controller时,它可以正常工作,但当我将名称更改为更多...不言自明时,它不会“T

  

致命错误: 类'brandNewClass'未在......中找到...

我甚至尝试使用提到here__autoload函数,但没有运气。

有什么想法吗?

5 个答案:

答案 0 :(得分:8)

看看这个优秀的教程 - 我希望它有所帮助

http://codeigniter.tv/a-10/Extending-the-core-MY_Controller-and-beyond

答案 1 :(得分:7)

自动装带器不会自动包含其他控制器。你必须像这样手动包含它:

if (!defined('BASEPATH'))exit('No direct script access allowed');

    include_once(APPPATH . 'controllers/brandnewclass.php');

答案 2 :(得分:3)

如果要创建自定义基本控制器并在其中扩展其他控制器,可以通过以下方式实现:

  1. MY_Controller文件夹中创建CI_Controller扩展application/core/并使其他控制器扩展MY_Controller,因为MY_Controller将从核心自动加载(我猜你已经知道但想要其他选择。

  2. MY_Controller中创建application/core/。然后创建其他级别的控制器,主要可以是Admin_ControllerFrontend_Controller。现在,其中一个控制器将为您实际使用的控制器奠定基础。

  3. e.g。在application/core/MY_Controller.php

    class MY_Controller extends CI_Controller {
        public function __construct(){
            parent::__construct();
        }
    }
    

    然后将在application/libraries/中创建管理员和前端控制器,并将MY_Controller扩展为

    class Admin_Controller extends MY_Controller {
        public function __construct(){
            parent::__construct();
        }
    }
    

    现在,任何控制器都可以扩展这两个控制器中的一个,但为此,您必须自动加载它们。对于这种情况下的自动加载,可能会产生混淆,因为在config / autoload.php中设置自动加载[&#39; libraries&#39;]将不起作用。那个自动加载工作在一个控制器内部,但在这里我们需要在那之前自动加载,即在类声明中。需要在config/config.php

    中设置此代码
    function __autoload($class) 
    {
      $path = array('libraries');
    
      if(strpos($class, 'CI_') !== 0) {
        foreach($path as $dir) {
            $file = APPPATH.$dir.'/'.strtolower($class).'.php';
            if (file_exists($file) && is_file($file))
                @include_once($file);
        }
      }
    }
    

    现在您可以创建自己的控制器

    class newController extends Admin_Controller
    {
    }
    

    这是最常用的方法,使您的结构非常干净和有效。可能需要一些努力才能理解,但绝对值得。

    1. 第三种方法只是对第二种方法的调整,只是基于您提到的不使用MY_Controller的条件 您可以直接Admin_ControllerFrontend_Controller延长CI_Controller而不是MY_Controller 如果可能是这种情况,这可能只会导致这些控制器中存在一些重复的代码

答案 3 :(得分:2)

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-base-Classes-Keeping-it-DRY 我怀疑你在尝试类似的东西? 有一个自动加载功能,您可以添加到配置文件,以便您始终不需要require_once()类。

答案 4 :(得分:1)

  1. 您应该将该类声明为抽象类,因为它不应该直接实例化。
  2. 您需要修改CodeIgniter自动加载器configuration file并将其添加到其中,或更改actual autoloader
  3. 你真的应该考虑不使用CodeIgniter:)