Codeigniter扩展控制器,未找到控制器

时间:2014-01-25 14:31:30

标签: php codeigniter controller extends

在Codeigniter 2.1.2中我想创建基本控制器,然后从该控制器扩展。它不起作用,我不知道为什么,我现在非常绝望。

\ application \ core \ MY_Base_Controller.php 中我有:

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

class MY_Base_Controller extends CI_Controller 
{
    function __construct()
    {
        parent::__construct();
...

\ application \ controllers \ Home.php 中我有:

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

class Home extends MY_Base_Controller {

错误信息是

致命错误:第3行的...... \ application \ controllers \ Home.php中找不到类'MY_Base_Controller'

我不知道该怎么做,我在互联网上读到我必须将基本控制器放到核心文件夹我做了什么,我必须用前缀MY_命名基本控制器,我做了。但 它仍然没有用。 在我的config.php中也是这一行

$config['subclass_prefix'] = 'MY_';

我使用xampp

在localhost上运行它

感谢您的帮助

修改

有人可以请关注以下链接尝试,并告诉我什么是错的。 我刚刚下载了codeigniter试图创建基本控制器并扩展欢迎控制器。不工作。在下面的rar中,只有修改过的文件。谢谢 http://goo.gl/sKHkDl

编辑2

我可以通过将 MY_Base_Controller 重命名为 MY_Controller 来实现此功能。 这是否意味着,我只能为控制器创建一个扩展类?例如。我不能拥有

  • MY_Base_Auth_Controller
  • MY_Base_Article_Controller

只是 MY_Controller

5 个答案:

答案 0 :(得分:15)

我在第一个CI应用程序中遇到了同样的问题,发现了需要检查的两个关键要素:

<强> 1。案例匹配: 根据您的服务器配置,目录中文件的名称需要与您的类的大小写相匹配。例如,您的班级被称为&#34; MY_Controller&#34;你的文件名必须是:&#34; MY_Controller.php&#34;在Linux服务器上。众所周知,Windows服务器存在大写文件名问题,因此您可以尝试命名控制器&#34; my_controller.php&#34;和/或将扩展名更改为&#34; my _&#34;在你的config.php而不是&#34; MY _&#34;

<强> 2。插入自动加载功能 由于我不知道的原因,Codeigniter在首次加载核心类之前不会自动识别和读取扩展核心类。这可能会导致您的扩展程序无法正确加载。要解决此问题,您可以将此简单的自动加载脚本添加到config.php

的最底部
/*
|--------------------------------------------------------------------------
| Autoload Custom Controllers
|--------------------------------------------------------------------------
|
*/
function __autoload($class) {
    if (substr($class,0,3) !== 'CI_') {
        if (file_exists($file = APPPATH . 'core/' . $class . EXT)) {
            include $file;
        }
    }
}

附注: 上面的解决方案在CodeIgniter 2.1.4上进行了测试。问题涉及CodeIgniter 2.1.2

答案 1 :(得分:10)

任何人使用CI 3+阅读此内容并尝试尝试同样的事情。 请注意,在删除php 4支持时,全局EXT已被折旧。您现在需要使用以下内容:

/*
|--------------------------------------------------------------------------
| Autoload Custom Controllers
|--------------------------------------------------------------------------
|
*/
function __autoload($class) {
    if (substr($class,0,3) !== 'CI_') {
        if (file_exists($file = APPPATH . 'core/' . $class . '.php')) {
            include $file;
        }
    }
}

答案 2 :(得分:5)

我遇到了同样的问题,但如果我在MY_Controller.php文件中创建了所有控制器,那么一切都运行良好。

<?php

class MY_Controller extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        // do some stuff
    }
}

class MY_Auth_Controller extends MY_Controller
{
    function __construct()
    {
        parent::__construct();
        // check if logged_in
   }
}

答案 3 :(得分:1)

是的,使用核心的MY_类,您只能覆盖codeigniter框架实体,例如Controller,Model,Config,Exception等。请参阅https://ellislab.com/codeigniter/user-guide/general/core_classes.html

答案 4 :(得分:0)

我遇到了同样的问题。我认为问题是,CI只加载单个文件,必须命名为&#34; MY_controller.php&#34;。 (system / core / Codeigniter.php - 第238行)。它只能加载&#34; MY_Controller.php&#34;。上面的回答类似于&#34; _autoload&#34;是因为我们压倒了这个功能。我猜它在CI-2和CI-3两者中。要么我们可以在核心文件上进行更改,要么我们可以使用自动加载功能,如上所述。

谢谢,