【问题标题】:codeigniter MY_Controller not found找不到codeigniter MY_Controller
【发布时间】:2012-11-09 03:19:21
【问题描述】:

我正在为网站使用 Codeigniter.2.1.3,所以我需要扩展 CI_Controller,这样我就可以添加一个与所有控制器一起执行的方法,所以我做了 user_guide 中的操作:

在 application/core 文件夹中创建一个名为 MY_Controller.php 的文件,在其中创建扩展 CI_Controller 的 MY_Controller 类,将我的常规控制器更改为扩展 MY_controller,如下所示: MY_controller.php:

class MY_Controller extends CI_Controller{
    protected $page;
    # Constructor
    function __construct (){
        parent::__construct();
        #code shared with all controllers
    }
    public function get_page(){
        #code to get_the right page here
    }
}

名为Regular.php的常规控制器:

class Regular extends MY_Controller{
     public function __construct(){
         parent::__construct();
     }
     public function index(){
          $this->get_page();
     }
}

但不断出现以下错误:

致命错误:在第 2 行的 /var/www/immo/CodeIgniter_2.1.3/application/controllers/regular.php 中找不到类“MY_Controller”

【问题讨论】:

  • 在你的应用程序/config/config.php 中你有什么$config['subclass_prefix']
  • 您确定 MY_Controller.php 在 application/core 文件夹中吗?此外,如果您在 linux 上,则可能区分大小写 :) 确保文件名与控制器名称相同。 MY_Controller.php,不是MY_controller.php
  • 在MY_Controller后面加一个空格
  • @Esailija $config['subclass_prefix'] = "MY_"
  • @Jeemusu:是的,它在应用程序/核心文件夹中

标签: php codeigniter controllers extending-classes


【解决方案1】:

您需要包含您的 MY_Controller 类或自动加载它。我建议您通过将以下内容添加到您的 application/config/config.php 文件来自动加载它。

function __autoload($class)
{
    if (strpos($class, 'CI_') !== 0)
    {
        if (file_exists($file = APPPATH . 'core/' . $class . EXT))
        {
            include $file;
        }
    }
} 

【讨论】:

  • 为什么我在扩展库时需要这样做,我不需要自动加载它,为什么这是不同的,并且在文档中没有任何内容。
  • 这是由 Phil Sturgeon 创建的关于该技术的原始文章 - philsturgeon.co.uk/blog/2010/02/…
  • 现在仍然无法正常工作,它给了我 2 个新警告:include_once(application/core/MY_Controller.php): failed to open stream: No such file or directory
  • include_once(): 未能打开 'application/core/MY_Controller.php' 以包含 (include_path='.:/var/www/ZendFramework/library')
  • 不知道这意味着在应用程序/核心中有文件 MY_Controller.php 并且它是可读的。
【解决方案2】:

确保文件名大小写正确。 Linux 服务器区分大小写。所以如果类名是 My_Controller 那么文件名应该是 My_Controller.php

【讨论】:

  • 里面的控制器类名是什么并不重要。只需拥有MY_Controller.php 即可解决问题。就我而言,我的控制器的名称是 CRM_controller.. :)
【解决方案3】:

$config['subclass_prefix'] = "MY_"

config.php 中检查,当然您应该在控制器名称中使用它,例如MY_Controller.php 并命名为“class MY_Controller....”

【讨论】:

    【解决方案4】:

    config/config.php

    /* load class in core folder */
    function my_load($class) {        
    
        if (strpos($class, 'CI_') !== 0) {            
            if (is_readable(APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php' )) {                
                require_once (APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php');                
            }
        }
    
    }
    
    spl_autoload_register('my_load');
    

    【讨论】:

    • 尽管所有其他解决方案确实有点道理,但这是唯一真正有帮助的解决方案。我相信核心文件夹中的类在我的情况下不会超载,因为我从 2.x 升级到 CodeIgnitor 3.x(但这需要确认)并且我可能在此过程中忘记了一些东西......
    【解决方案5】:

    这个答案迟到了,但我得到了

    “致命错误:找不到类‘MY_Controller’”错误

    当我在 web 根目录而不是 application/controllers 目录中有一个同名的控制器 (.php) 文件时。

    实际上不知道它是如何到达那里的,但是当我删除它时问题就消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多