Codeigniter扩展了扩展的MY_Controller

时间:2011-01-05 20:59:58

标签: php codeigniter

我严格遵循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延伸,则以下代码段正在运行:

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

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

CI-Version:1.7.3

5 个答案:

答案 0 :(得分:7)

您需要在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

答案 1 :(得分:5)

您应该将Public_controller放入MY_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关于如何将auth逻辑包装到扩展控制器中。当我开始讨论构建你的控制器时,这大概只有一半。

答案 2 :(得分:1)

问题在这里解决了:http://devcrap.net/pl/2011/09/04/codeigniter-dziedziczenie-z-my_controller-extends-my_controller/。在抛光,但代码是好的:]

答案 3 :(得分:1)

我有这样的问题,经过一些搜索我发现自己犯了错误,因为我的控制器类名是MY_Controller,但文件名是My_Controller [Case not matching]。 注意: - 在localhost中我没有任何错误。

在扩展控制器中我使用

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

即使我收到错误。

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

答案 4 :(得分:0)

我有一个名为 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 ”会生成类'My_app_controller'找不到异常

我找到了两个解决方案:

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

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

  3. 手册说:

      

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

    嗯......他们是。

    无论如何,我更喜欢使用include_once解决方案,因为我认为每个类有一个文件更好,而My_app_controller位于application / controllers / my_app文件夹下。 (因此将存在application / controllers / other_apps)