2012-07-29 32 views
2

所有我想要做的东西很简单:扩展是CI_Controller

  • 创建一个类(比方说brandNewClass - 不MY_Controller)延伸是CI_Controller
  • 创建延伸brandNewClass
其他控制器

例如

class brandNewClass extends CI_Controller { 

    public function index() 
    { 

    } 

    public function info() 
    { 

    } 
} 

一样使用(在文件中/controllers下):

<?php 

class newController extends brandNewClass 
{ 
} 

?> 

的事情是,虽然它的工作原理,当我复制/application/core下的文件,并将其命名为MY_Controller,当我改变这个名字更多......不言而喻,事实并非如此。

Fatal error:Class 'brandNewClass' not found in .... on line ..

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

任何想法?

回答

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

您能否展开第3点? – Chris 2013-02-10 04:08:23

6

磁带自动加载机不包括全自动其他控制器。你将不得不包括它手动像这样:

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

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

如果你想创建一个自定义的基本控制器并进行其他控制人不存在扩展,您可以在以下几个方面做:

  1. 创建应用程序/核心/文件夹扩展是CI_Controller MY_Controller,让其他控制器扩展MY_Controller作为MY_Controller将从核心自动载入(这个我想你已经知道,但希望其他的替代品。

  2. 在application/core /中创建MY_Controller。然后创建其他级别的控制器,主要可以通过Admin_Controller和Frontend_Controller。现在,其中一个控制器将为您实际使用的控制器打下基础。为此,MY_Controller(在application/core /中将扩展CI_Controller。

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

然后管理员和前端控制器将在应用程序/库中创建/和将延伸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_Controller或Frontend_Controller直接延伸是CI_Controller并没有扩大的情况MY_Controller ,可能只是导致一些口是心非的代码在这两个控制器中,如果这可能是这种情况