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 是否提供此功能?
@loki9 我这么认为是因为__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-4 中的错误?