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

Posted

技术标签:

【中文标题】Codeigniter 扩展控制器,找不到控制器【英文标题】:Codeigniter extending controller, controller not found 【发布时间】:2014-01-25 14:31:29 【问题描述】:

在 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

【问题讨论】:

【参考方案1】:

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

1.案例匹配: 根据您的服务器配置,目录中文件的名称将需要与您的类的大小写相匹配。例如,如果你的类被称为“MY_Controller”,你的文件名需要是:Linux 服务器上的“MY_Controller.php”。众所周知,Windows 服务器存在大写文件名问题,因此您可以尝试将控制器命名为“my_controller.php”和/或在 config.php 中将扩展名更改为“my_”而不是“MY_”

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

【讨论】:

我想像这样在 application/core 中添加多个自定义控制器( 表示 extends):core/MY_Top controllers/Connection 和其他控制器...但是 CI 无法识别 MY_Second,直到我添加了您给出的给定 __autoload() 方法。非常感谢 感谢您的解决方案.. 太棒了.. 拯救我的一天 CI3 是否提供此功能? @lok​​i9 我这么认为是因为__autoload() 是 PHP 的核心函数。见php.net/autoload @Alexander Yagovdik 回答解释了“出于我不知道的原因”部分。我也在绞尽脑汁想知道为什么。【参考方案2】:

任何使用 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;
        
    

【讨论】:

【参考方案3】:

我遇到了同样的问题,但是如果我在 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
   

【讨论】:

简单而强大的解决方案!我已经按照你的方式进行了,它对我也很有效! 如果你有多个控制器并且每个控制器中有许多功能,你会受到影响。 这是一种糟糕的做法,修复命名约定问题比这样做要好得多。 (见 Websmith 的回答) 有点不相关,但在 Windows 中 My_Controller.php 有效,但在 Linux 上它区分大小写并且需要为 MY_Controller.php - 我想我会提到它,因为这让我失望了 不错的答案...非常好。【参考方案4】:

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

【讨论】:

但是你可以使用 __autoload() 函数来跳过这个限制。【参考方案5】:

我遇到了同样的问题。我认为问题是,CI 只加载必须命名为“MY_controller.php”的单个文件。 (系统/核心/Codeigniter.php - 第 238 行)。它只加载“MY_Controller.php”。上面给出的答案(例如“_autoload”)之所以存在,是因为我们正在覆盖该功能。我猜它在 CI -2 和 CI - 3 中。我们可以在核心文件中进行更改,或者我们可以使用 autload 函数,如上所述。

谢谢,

【讨论】:

以上是关于Codeigniter 扩展控制器,找不到控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 上找不到对象

Codeigniter:调用控制器时出现 404

我该如何解决这个“找不到对象!” CodeIgniter-4 中的错误?

Codeigniter 404 Page Not Found 找不到您请求的页面

CodeIgniter 搜索结果分页

Codeigniter:多级模型扩展不起作用。收到错误“找不到类”