CodeIgniter:在控制器内加载控制器

Dan*_*iel 43 php codeigniter

我有一个home控制器,其index动作显示一组特色产品.但是,产品通过product控制器进行管理,包括专有模型和视图.

如何product从控制器中的index操作中访问信息homeproduct由于未在运行时加载类,并且CodeIgniter不提供动态加载控制器的方法,因此实例化将不起作用.将product类放入库文件中也不起作用.

确切地说,我需要product在索引视图中插入产品视图(由控制器处理的数据填充).我正在运行CodeIgniter 2.0.2.

小智 63

像这样加载它

$this->load->library('../controllers/instructor');
Run Code Online (Sandbox Code Playgroud)

并调用以下方法:

$this->instructor->functioname()
Run Code Online (Sandbox Code Playgroud)

这适用于笨2.X.

  • 谢谢你.请注意,CodeIgniter将控制器视为单例,因此我发现一旦加载另一个控制器,原始控制器将无法正常工作.加载另一个控制器后,请确保不要尝试在原始控制器中使用`$ this-> load`或任何已加载的模型; 相反,使用`$ ci = get_instance()`并仅通过`$ ci`访问模型(例如`$ ci-> user_model`). (4认同)
  • 最好的解决方案 (3认同)

Wes*_*rch 29

如果你有兴趣,那里有一个完善的软件包,你可以添加到你的Codeigniter项目中来处理这个问题:

https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/

Modular Extensions使CodeIgniter PHP框架模块化.模块是独立组件的组,通常是模型,控制器和视图,安排在应用程序模块子目录中,可以放入其他CodeIgniter应用程序中.

好的,所以最大的变化是现在你正在使用模块化结构 - 但对我来说这是可取的.我已经使用CI大约3年了,并且无法想象没有Modular Extensions的生活.

现在,这是处理直接调用控制器以呈现视图部分的部分:

// Using a Module as a view partial from within a view is as easy as writing:
<?php echo modules::run('module/controller/method', $param1, $params2); ?>
Run Code Online (Sandbox Code Playgroud)

这里的所有都是它的.我通常使用它来加载小"小部件",如:

  • 活动日历
  • 最新新闻文章列表
  • 通讯注册表格
  • 民意调查

通常,我为每个模块构建一个"小部件"控制器,并仅将其用于此目的.

当我开始使用Codeigniter时,您的问题也是我的第一个问题.我希望这可以帮助你,即使它可能比你想要的多一点.从那以后我就一直在使用MX而且没有回头.

请务必阅读文档,并在Codeigniter论坛上查看有关此软件包的大量信息.请享用!


小智 8

在这种情况下,你可以尝试一些旧的学校PHP.

// insert at the beggining of home.php controller require_once(dirname(__FILE__)."/product.php"); // the controller route.

然后,你会有类似的东西:

Class Home extends CI_Controller
{
 public function __construct()
 {
  parent::__construct();
  $this->product = new Product();
  ...
 }

 ...
 // usage example
 public function addProduct($data)
 {
  $this->product->add($data);
 }
}
Run Code Online (Sandbox Code Playgroud)

然后根据需要使用控制器的方法.


Sal*_* P. 8

只是为了补充Zain Abbas所说的更多信息:

以这种方式加载控制器,并像他说的那样使用它:

$this->load->library('../controllers/instructor');

$this->instructor->functioname();
Run Code Online (Sandbox Code Playgroud)

或者您可以创建一个对象并以这种方式使用它:

$this->load->library('../controllers/your_controller');

$obj = new $this->your_controller();

$obj->your_function();
Run Code Online (Sandbox Code Playgroud)

希望这可以提供帮助.


mac*_*ict 6

基于@Joaquin Astelarra响应,我设法编写了一个名为load_controller_helper.php的小助手:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if (!function_exists('load_controller'))
{
    function load_controller($controller, $method = 'index')
    {
        require_once(FCPATH . APPPATH . 'controllers/' . $controller . '.php');

        $controller = new $controller();

        return $controller->$method();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用/调用它:

$this->load->helper('load_controller');
load_controller('homepage', 'not_found');
Run Code Online (Sandbox Code Playgroud)

注意:第二个参数不是必需的,因为它将运行名为index的方法,就像CodeIgniter一样.

现在,您可以在不使用HMVC的情况下在另一个控制器内加载控制器.

稍后编辑:请注意,此方法可能会产生意外结果.总是测试它!