在Codeigniter中,将一个控制器扩展到另一个控制器

时间:2017-07-07 06:09:44

标签: php codeigniter

我正在使用codeigniter(3.1.5)并且我的应用程序/控制器/文件夹中有两个控制器。使用名称控制器A和控制器B.我想扩展控制器B中的控制器A,以便我可以使用控制器A的方法。但它会生成类未找到错误。

以下是我的示例代码:

A_Controller.php:

defined('BASEPATH') OR exit('No direct script access allowed');
class A_Controller extends CI_Controller {
  public function index()
  {
  }

  public function display(){
     echo 'base controller function called.';
  }
 }

B_Controller.php:

 defined('BASEPATH') OR exit('No direct script access allowed');
 class B_Controller extends A_Controller {

 }

我想在控制器B中执行控制器A的display()方法。 如果我将控制器A放在application / core /文件夹中,并在application / config / config.php文件中生成

  

$ config ['subclass_prefix'] ='A _';

然后我就可以访问控制器A的方法。

请建议。 提前谢谢。

5 个答案:

答案 0 :(得分:3)

在另一个控制器中扩展控制器并不是很好。使用MVC构建,尤其是使用CI,您还可以选择其他方法来实现此目的。

  1. 在扩展MY_Controller的{​​{1}}内使用课程application/core。之后,所有(或部分)控制器都应扩展CI_Controller。在MY_Controller中,您可以拥有许多功能,您可以在控制器中调用所需的功能。
  2. 使用库。在MY_Controller中编写自己的库,并将其加载到控制器中的任何位置。库是一个具有项目功能的类。
  3. 使用帮助器。在application/libraries中编写自己的帮助程序并将其加载到控制器中。帮助者应具有您的应用程序的一般用途。

    通过这种方式,您的代码将更灵活,并且可以在将来重复使用。与2控制器混乱对我来说似乎很糟糕。请记住,使用CI的默认路由系统,您可能会感到困惑。

答案 1 :(得分:1)

尝试使用以下代码。

defined('BASEPATH') OR exit('No direct script access allowed');
     class B_Controller extends A_Controller {
        public function test()
        {
            $this->display();
        }
     }

答案 2 :(得分:0)

在控制器中使用构造

defined('BASEPATH') OR exit('No direct script access allowed');
 class B_Controller extends A_Controller {

    public function __construct() {
         parent::__construct();
    }
    public function test()
    {
        $this->display();
    }
 }

答案 3 :(得分:0)

我找到了这样的解决方案:在这样的子控制器上包含父控制器-

require_once(APPPATH."modules/frontend/controllers/Frontend.php");

然后我的函数就是这样-


class Home extends Frontend {

    function __construct() {
        parent::__construct();
    }

    function index() {
        echo $this->test(); //from Frontend controller
    }

}

我希望这会有所帮助。

答案 4 :(得分:0)

将此脚本添加到B_Controller中:

include_once (dirname(__FILE__) . "/A_Controller.php");

例如B_Controller.php:

defined('BASEPATH') OR exit('No direct script access allowed');
include_once (dirname(__FILE__) . "/A_Controller.php");
class B_Controller extends A_Controller {

 }