我所要做的就是相当简单:
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
函数,但没有运气。
有什么想法吗?
答案 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)
如果要创建自定义基本控制器并在其中扩展其他控制器,可以通过以下方式实现:
在MY_Controller
文件夹中创建CI_Controller
扩展application/core/
并使其他控制器扩展MY_Controller
,因为MY_Controller
将从核心自动加载(我猜你已经知道但想要其他选择。
在MY_Controller
中创建application/core/
。然后创建其他级别的控制器,主要可以是Admin_Controller
和Frontend_Controller
。现在,其中一个控制器将为您实际使用的控制器奠定基础。
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
{
}
这是最常用的方法,使您的结构非常干净和有效。可能需要一些努力才能理解,但绝对值得。
MY_Controller
的条件
您可以直接Admin_Controller
或Frontend_Controller
延长CI_Controller
而不是MY_Controller
如果可能是这种情况,这可能只会导致这些控制器中存在一些重复的代码答案 3 :(得分:2)
http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-base-Classes-Keeping-it-DRY 我怀疑你在尝试类似的东西? 有一个自动加载功能,您可以添加到配置文件,以便您始终不需要require_once()类。
答案 4 :(得分:1)