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
相关产品推荐
相关产品推荐

