【问题标题】:In Codeigniter extends one controller into another controller在 Codeigniter 中将一个控制器扩展到另一个控制器
【发布时间】:2017-12-11 07:58:09
【问题描述】:

我正在使用 codeigniter(3.1.5),并且我的 application/controllers/ 文件夹中有两个控制器。名称为控制器 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 文件中,则 make

$config['subclass_prefix'] = 'A_';

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

请提出建议。 提前致谢。

【问题讨论】:

标签: php codeigniter


【解决方案1】:

在 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 {

 }

【讨论】:

    【解决方案2】:

    我找到了使用在子控制器上包含父控制器的解决方案 -

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

    然后我的函数是这样的 -

    
    class Home extends Frontend {
    
        function __construct() {
            parent::__construct();
        }
    
        function index() {
            echo $this->test(); //from Frontend controller
        }
    
    }
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      在控制器中使用构造

      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();
          }
       }
      

      【讨论】:

        【解决方案4】:

        在另一个控制器中扩展一个控制器并不是很好。使用 MVC 尤其是 CI 进行构建,您还有其他选择来实现这一目标。

        1. application/core 中使用一个类MY_Controller 来扩展CI_Controller。稍后,您的所有(或部分)控制器应该扩展MY_Controller。在 MY_Controller 中你可以有很多函数,你可以在你的控制器中调用你想要的函数。

        2. 使用库。在application/libraries 中编写您自己的库,并将其加载到您的控制器中您想要的任何位置。库是为您的项目提供功能的类。

        3. 使用助手。在application/helpers 中编写您自己的助手并将其加载到您的控制器中。助手应该对您的应用程序具有通用用途。

          这样,您的代码将来会更加灵活和可重用。弄乱 2 个控制器对我来说似乎很糟糕。请记住,对于 CI 的默认路由系统,您可能会感到困惑。

        【讨论】:

        • 是的,你告诉我标准的方式,但在我的情况下,我想将基类的属性继承到子类中,只是为了多站点的目的。谢谢。
        【解决方案5】:

        尝试使用以下代码。

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

        【讨论】:

        • 感谢您的回复...但问题不同,它给扩展 A_Controller 提供了“找不到类”错误。
        猜你喜欢
        • 2011-08-19
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 2012-09-30
        • 2014-04-13
        • 1970-01-01
        • 2011-09-23
        • 2018-02-11
        相关资源
        最近更新 更多