我正在使用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的方法。
请建议。 提前谢谢。
答案 0 :(得分:3)
在另一个控制器中扩展控制器并不是很好。使用MVC构建,尤其是使用CI,您还可以选择其他方法来实现此目的。
MY_Controller
的{{1}}内使用课程application/core
。之后,所有(或部分)控制器都应扩展CI_Controller
。在MY_Controller中,您可以拥有许多功能,您可以在控制器中调用所需的功能。MY_Controller
中编写自己的库,并将其加载到控制器中的任何位置。库是一个具有项目功能的类。使用帮助器。在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 {
}