被叫控制器无法访问任何内容

时间:2018-05-20 17:12:50

标签: php html xampp codeigniter-3 controllers

在codeigniter中我有我的主控制器:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Main extends CI_Controller
{
    public function index()
    {
        $this->load->library('../controllers/forum');
        $obj = new $this->forum();
        $obj->test();
    }
}

我试图访问的控制器:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Forum extends CI_Controller
{
    function __construct()
    {
        echo "testing1";
        $this->load->library('session');
        parent::__construct();
        $this->load->database();
        $this->load->model('model_forum');
    }

    public function index(){

    }

    public function test(){
        echo "testing2";
        $this->data['forums'] = $this->model_forum->getForums();
        $this->load->view('homepage', $this->data);
    }
}

我的model_forum.php文件一切正常,因为如果我将所有代码放在主控制器中,它就可以工作。但是,如果我试图访问论坛控制器,那么没有任何作用,只有&#34; testing1&#34;回声经过。错误图片:PHP error

任何人都知道我做错了什么?我是PHP和codeigniter的新手,所以我挣扎了一下。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您无法从CI中的控制器加载控制器 - 除非您使用HMVC或其他东西。

你应该考虑一下你的架构。如果您需要从另一个控制器调用控制器方法,那么您应该将该代码抽象出一个帮助器或库,并从两个控制器中调用它。

<强>更新

再次阅读你的问题之后,我意识到你的最终目标不一定是HMVC,而是URI操纵。如果我错了,请纠正我,但似乎你正在尝试使用第一部分作为方法名称来完成URL并完全忽略控制器名称。

如果是这种情况,您可以通过creative with your routes获得更清晰的解决方案。

对于一个非常基本的例子,假设您有两个控制器,controller1controller2Controller1有一个方法method_1 - controller2有方法method_2

您可以设置如下路线:

$route['method_1'] = "controller1/method_1";
$route['method_2'] = "controller2/method_2";

然后,您可以使用http://example.com/method_1等网址调用方法1,使用http://example.com/method_2调用方法2。

虽然这是一个硬编码,非常基本的例子 - 但是如果您需要做的就是从URL中删除控制器,它可以让您到达您需要的位置。

您也可以使用remapping your controllers

从文档:“如果您的控制器包含一个名为_remap()的函数,无论您的URI包含什么,它都会被调用。”:

public function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}