【问题标题】:Codeigniter extending extended MY_ControllerCodeigniter 扩展扩展的 MY_Controller
【发布时间】:2011-01-05 20:59:57
【问题描述】:

我严格按照how-to article by Phil Sturgeon,扩展基本控制器。但我仍然遇到一些错误。

我的 3 门课:

// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
    public function __construct(){
        parent::__construct();
    }
}

// application/libraries/Public_Controller.php
class Public_Controller extends MY_Controller{
    public function __construct(){
        parent::__construct();

    }    
}

// application/controllers/user.php
class User extends Public_Controller{
    public function __construct(){
        parent::__construct();
    }
}

致命错误:在第 2 行的 /srv/www/xxx/application/controllers/user.php 中找不到类“Public_Controller”

好奇的是,如果我直接从MY_Controller 扩展,下面的 sn-p 正在工作:

// application/controllers/user.php
class User extends MY_Controller{
    public function __construct(){
        parent::__construct();
    }
}

我已经通过__autoload() 或手动加载了控制器。控制器加载成功。

CI 版本:1.7.3

【问题讨论】:

  • 你是在加载 Public_Controller.php 之前加载 MY_Controller.php 吗?
  • 能否把__autoload函数贴在config.php中?
  • 这个问题有更好的答案:stackoverflow.com/questions/21663045/… 即使它被标记为与此重复

标签: php codeigniter


【解决方案1】:

您需要在您的 MY_Controller 中要求公共控制器

// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
    public function __construct(){
        parent::__construct();
    }
}

require(APPPATH.'libraries/Public_Controller.php');

您收到错误是因为 Public_Controller 从未加载。这样做可以让您从 Public_Controller 扩展

我喜欢你正在做的事情,因为我一直都这样做。

当您想创建 Admin_Controller 时,您也可以在 MY_Controller 中执行此操作

// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
    public function __construct(){
        parent::__construct();
    }
}

require(APPPATH.'libraries/Public_Controller.php'); // contains some logic applicable only to `public` controllers
require(APPPATH.'libraries/Admin_Controller.php'); // contains some logic applicable only to `admin` controllers

【讨论】:

  • @Phil,他错过了你帖子中的那部分 :)
  • 哦。 “我已经通过 __autoload() 或手动加载了控制器。”谁知道:)
  • 致那些想要使用这个sn-p的人:由于版本2 Controller核心类更改为CI_Controller
  • @Phil 使用钩子怎么样?这个方法我用过,stackoverflow.com/a/22125436/567854
【解决方案2】:

您应该将Public_controllerMY_Controller 放在MY_Controller.php 中

// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
    public function __construct(){
        parent::__construct();
    }
}

class Public_Controller extends MY_Controller{
    public function __construct(){
        parent::__construct();

    }    
}

我在任何地方都使用 __construct,它运行良好我最近写了an article,关于如何将您的身份验证逻辑包装到您的扩展控制器中。当我开始讨论构建你的控制器时,它已经完成了大约一半。

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      我遇到了这样的问题,经过一番搜索,我发现自己犯了错误,因为我的控制器类名是 MY_Controller 但文件名是 My_Controller[大小写不匹配]。 注意:- 在本地主机中我没有任何错误。

      在我使用的扩展控制器中

      class Home  extends MY_Controller{
         function __construct() {
         parent::__construct();
        }
      }
      

      即使我得到了错误。

      将我的文件名更改为 MY_Controller 后,它开始运行良好。

      【讨论】:

        【解决方案5】:

        我有一个名为 MY_Controller 的自定义控制器类,它扩展了 CI_Controller 并且工作正常。它位于应用程序/核心,并具有自定义功能,可在我的站点中加载视图。

        我使用一个抽象类 My_app_controller 来扩展 MY_Controller 用于 my_app 的特定行为,我希望 my_app 中的每个控制器都扩展这个抽象类。 (我在网站上使用了不同的应用程序,所以一些应用程序会扩展My_app_controller,而其他应用程序会扩展My_other_apps_controllers

        但是当我尝试从我的应用程序中的任何控制器扩展My_app_controller 时,“Main_app_controller extends My_app_controller”会生成一个Class 'My_app_controller' not found 异常。。 p>

        我找到了两个解决方案:

        1. 在 Main_app_controller.php 文件中使用 include_once
          include_once APPPATH.'controllers/path/to/My_app_controler.php';

        2. 打破代码点火器的“每个文件一个类”规则,并在同一文件中定义我的My_app_controller MY_Controller 是(在应用程序/核心下)。

        手册说:

        为每个类使用单独的文件,除非类紧密 相关

        嗯……他们是。

        无论如何,我更喜欢使用 include_once 解决方案,因为我认为每个类有一个文件会更好,而 My_app_controller 位于 application/controllers/my_app 文件夹下。 (所以应用程序/控制器/其他应用程序将存在)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-21
          • 2017-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-10
          • 2015-01-22
          • 2023-03-12
          相关资源
          最近更新 更多