簡體   English   中英

Codeigniter 擴展 controller,未找到 controller

[英]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_Base_Auth_Controller
  • MY_Base_Article_Controller

只有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM