2

我要做的只是一些相当简单的事情:

  • 创建一个扩展 CI_Controller的类(比方说brandNewClass- NOT )MY_Controller
  • 创建其他扩展的控制器brandNewClass

例如

class brandNewClass extends CI_Controller {

    public function index()
    {

    }

    public function info()
    {

    }
}

像这样使用(在 下的文件中/controllers):

<?php

class newController extends brandNewClass
{
}

?>

问题是,虽然它在我复制文件/application/core并将其命名为时有效MY_Controller,但当我将名称更改为更多......不言自明时,它不会。

致命错误: 在线..中找不到类“brandNewClass”

我什至尝试过使用这里__autoload提到的功能,但没有任何运气。

有任何想法吗?

4

5 回答 5

8

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

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

    include_once(APPPATH . 'controllers/brandnewclass.php');
于 2012-07-29T17:06:14.337 回答
8

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

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

于 2012-07-30T07:52:01.140 回答
3

如果你想创建一个自定义的基本控制器并让其他控制器在那里扩展,你可以通过以下方式进行:

  1. 在文件夹中创建MY_Controller扩展并使其他控制器扩展为将从核心自动加载(我猜你已经知道但想要其他替代方案。CI_Controllerapplication/core/MY_ControllerMY_Controller

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

例如在application/core/MY_Controller.php

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

然后 Admin 和 Frontend 控制器将被创建application/libraries/并扩展MY_Controller

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

现在,任何控制器都可以扩展这 2 个控制器之一,但为此您必须自动加载它们。在这种情况下,自动加载可能会造成混淆,因为在 config/autoload.php 中设置 autoload['libraries'] 将不起作用。该自动加载在控制器内部工作,但在这里我们需要在此之前自动加载,即在类声明中。需要将此代码设置为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 如果可能是这种情况,这可能只会导致这两个控制器中的一些代码重复
于 2014-05-23T07:38:14.237 回答
2

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

于 2012-07-29T19:21:03.143 回答
1
  1. 您应该将该类声明为抽象类,因为它不应该被直接实例化。
  2. 您需要修改 CodeIgniter 自动加载器配置文件并将您的类添加到其中,或者更改实际的自动加载器
  3. 你真的应该考虑不使用 CodeIgniter :)
于 2012-07-29T17:05:12.973 回答