首页 > 解决方案 > 被调用的控制器不能访问任何东西

问题描述

在 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 文件一切正常,因为如果我将所有代码放在主控制器中,它就可以工作。但是,如果我试图访问论坛控制器,则没有任何效果,只有“testing1”回显通过。错误图片:PHP 错误

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

标签: phphtmlxamppcodeigniter-3controllers

解决方案


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

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

更新

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

如果是这种情况,您可以通过对路线进行创意来获得更清洁的解决方案。

对于一个非常基本的示例,假设您有两个控制器,controller1并且controller2. Controller1有一个方法method_1- 并且controller2有一个方法method_2

您可以像这样设置路线:

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

然后,您可以使用类似的 URL 调用方法 1,http://example.com/method_1使用http://example.com/method_2.

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


您也可以重新映射您的控制器

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

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

推荐阅读