You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter中如何调用其他控制器的方法?是否可行?

Question

我创建了名为crud.php的控制器,代码如下:

class Crud extends CI_Controller{
    function __construct(){
        parent::__construct();
        $this->load->model('m_data');
        $this->load->helper('url');
    }
    public function admin(){
        $data['produk'] = $this->m_data->tampil_data()->result();
        $this->load->view('v_admin',$data);
    }
}

我希望将其中的admin()方法在admin.php控制器中调用,admin.php的代码如下:

class Admin extends CI_Controller{
    function __construct(){
        parent::__construct();
        if($this->session->userdata('status') != "login"){
            redirect(base_url("login"));
        }
    }
    function index(){
        $this->crud->admin();
    }
}

请问调用其他控制器中方法的代码是什么?这种操作是否可行?


Answer

首先啊,你直接用$this->crud->admin()这种方式调用另一个控制器的方法,在CodeIgniter里不是标准操作,而且十有八九会报错——因为$this对象里并没有自动加载Crud控制器的实例。

下面给你几种可行的实现思路,按照最佳实践排序:

1. 把共享逻辑抽离到模型(最推荐)

从MVC的设计原则来说,控制器的职责是处理请求、协调模型和视图,不应该让控制器之间互相调用。所以最好的办法是把Crud控制器里admin()方法的核心逻辑(也就是获取产品数据的部分)放到模型里,然后在Admin控制器里直接调用模型、加载视图:

// 修改Admin控制器的index方法
function index(){
    $this->load->model('m_data');
    $this->load->helper('url');
    $data['produk'] = $this->m_data->tampil_data()->result();
    $this->load->view('v_admin',$data);
}

这样代码耦合度低,后续维护起来也方便,完全符合CI的设计理念。

2. 手动加载并实例化目标控制器

如果你实在需要调用另一个控制器的方法,可以手动加载控制器实例:

function index(){
    // 加载Crud控制器
    $this->load->controller('crud');
    // 调用它的admin方法
    $this->crud->admin();
}

不过要注意,这种方式在部分CI版本中可能需要额外配置,而且容易让控制器之间的依赖变复杂,除非万不得已,不建议这么做。

3. 用URL重定向

如果你的需求只是让访问Admin的index方法时跳转到Crud的admin页面,那直接用重定向就好:

function index(){
    redirect('crud/admin');
}

这种方式会改变浏览器地址栏的URL,适合不需要在Admin控制器里做额外处理的场景。

总结

直接跨控制器调用方法的操作不是CI推荐的最佳实践,虽然能通过手动加载控制器实现,但更建议你遵循MVC原则,把共享逻辑放到模型里,这样代码结构更清晰、易维护。

内容的提问来源于stack exchange,提问作者Poil Panda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:18:04