【问题标题】:Codeigniter extending controller, controller not foundCodeigniter 扩展控制器,找不到控制器
【发布时间】: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?

【问题讨论】:

    标签: php codeigniter controller extends


    【解决方案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 函数,如上所述。

      谢谢,

      【讨论】:

        猜你喜欢
        • 2015-01-22
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2012-01-10
        相关资源
        最近更新 更多