在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_Controller ?
答案 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两者中。要么我们可以在核心文件上进行更改,要么我们可以使用自动加载功能,如上所述。
谢谢,