[英]Codeigniter extending controller, controller not found
在 Codeigniter 2.1.2 中,我想創建基礎 controller,然后從這個 controller 擴展。它不起作用,我不知道為什么,我現在非常絕望。
在\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 {
錯誤信息是
致命錯誤:Class 在第 3 行的...\application\controllers\Home.php 中找不到“MY_Base_Controller”
我不知道該怎么做,我在整個 inte.net 上閱讀了我必須將 base controller 放入核心文件夾的內容,我必須使用前綴 MY_ 命名 base controller,我做到了。 但它仍然沒有工作。 在我的 config.php 中也是這一行
$config['subclass_prefix'] = 'MY_';
我使用 xampp 在本地主機上運行它
謝謝您的幫助
編輯
有人可以下載以下鏈接試試看,然后告訴我哪里出了問題。 我剛剛下載了 codeigniter 嘗試創建基礎 controller 並擴展歡迎 controller。不工作。 在下面的 rar 中,只有修改過的文件。 謝謝http://goo.gl/sKHkDl
編輯 2
我可以通過將 MY_Base_Controller 重命名為MY_Controller來實現這一點。 這是否意味着,我只能為 controller 創建一個擴展的 class? 例如。 我不能有
只有MY_Controller嗎?
我在第一個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
任何人使用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;
}
}
}
我遇到了同樣的問題,但如果我在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
}
}
是的,使用核心的MY_類,您可以僅覆蓋codeigniter框架實體,例如Controller,Model,Config,Exception等。 請參閱https://ellislab.com/codeigniter/user-guide/general/core_classes.html
我遇到了同樣的問題。 我認為問題是,CI只加載單個文件,必須命名為“MY_controller.php”。 (system / core / Codeigniter.php - 第238行)。 它只加載“MY_Controller.php”。 上面提到的答案就像“_autoload”那樣,因為我們正在覆蓋這個功能。 我猜它在CI-2和CI-3中。要么我們可以在核心文件上進行更改,要么我們可以使用自動加載功能,如上所述。
謝謝,
我想找到了解決方案,當擴展時你需要使用 require_once 來查找 class 的文件。
require_once(APPPATH."controllers/Admin.php");
defined('BASEPATH') OR exit('No direct script access allowed');
class MySubClass extends Admin{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.