Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller 在Codeigniter中显示多个视图的最佳实践是什么?_Model View Controller_Codeigniter_View - Fatal编程技术网

Model view controller 在Codeigniter中显示多个视图的最佳实践是什么?

Model view controller 在Codeigniter中显示多个视图的最佳实践是什么?,model-view-controller,codeigniter,view,Model View Controller,Codeigniter,View,我试图确定从控制器中的同一方法调用多个视图的最佳实践 在控制器中,最好进行一次视图调用,然后让该视图调用它需要的所有视图,还是在控制器中按顺序调用您需要的所有视图 例如: function index(){ //set all data variables //then send them to the view $this->load->view($index_view, $data); } 或 Codeigniter指南显示了这两种方法,但似乎没有建议最佳实践

我试图确定从控制器中的同一方法调用多个视图的最佳实践

在控制器中,最好进行一次视图调用,然后让该视图调用它需要的所有视图,还是在控制器中按顺序调用您需要的所有视图

例如:

function index(){
   //set all data variables
   //then send them to the view
   $this->load->view($index_view, $data);
}


Codeigniter指南显示了这两种方法,但似乎没有建议最佳实践……有吗?

我认为没有一个明确的答案。选择一个并坚持下去,保持一致性很重要


无论如何,我更喜欢第二个视图。

我认为控制器应该只显示一个视图。然后由视图决定是否显示页眉、页脚、侧边栏或其他内容。控制器不必在意,它的工作是从模型中获取数据并将其传递给视图。不决定视图是否应该有页眉和页脚。

同意Christian Davén的观点:它的视图/显示逻辑不是数据或业务/逻辑。本质上,这与在导航、页脚等代码段中使用php Include相同。您只是嵌入了标记。

我不喜欢在视图中包含页眉/页脚的方式,我也不喜欢每次在每个控制器函数中加载页脚和页眉

<?php
// in application/libraries/MY_Controller.php
class MY_Controller extends Controller {
    function _displayPage($page, $data = array()) {
        $this->view->load('header', $data);
        $this->view->load($page, $data);
        $this->view->load('footer', $data);
    }
}
?>

// in application/controllers/home.php
<?php
class Home extends MY_Controller {
    function index() {
        $this->_displayPage('home/index', array('title' => 'Home'));
    }
}
?>
为了解决这个问题,我用自己的视图显示函数扩展了控制器类

<?php
// in application/libraries/MY_Controller.php
class MY_Controller extends Controller {
    function _displayPage($page, $data = array()) {
        $this->view->load('header', $data);
        $this->view->load($page, $data);
        $this->view->load('footer', $data);
    }
}
?>

// in application/controllers/home.php
<?php
class Home extends MY_Controller {
    function index() {
        $this->_displayPage('home/index', array('title' => 'Home'));
    }
}
?>

//在application/controllers/home.php中

不确定这是否是CodeIgniter的“最佳实践”,但对我来说是有意义的。

这是预期的行为。一旦设置了变量,它们就可以在控制器类及其视图文件中使用。在$this->load->view()中发送数组与在调用视图文件之前直接将数组发送到$this->load->vars()相同。对于大多数在控制器中使用多个视图的人来说,这简化了工作。如果您在一个控制器中使用多个视图文件,并且希望每个视图文件独占地拥有自己的变量集,则需要在视图调用之间手动清除$this->load->\u ci\u cached\u vars数组

Loader类中的代码注释描述了另一种情况,说明了为什么这是期望的默认行为:

  • 您可以使用专用的$this->load_vars()设置变量
  • 函数或通过此函数的第二个参数。我们合并
  • 并缓存这两种类型,以便嵌入其中的视图
  • 其他视图可以访问这些变量

这就是我一直在做的事情。似乎继续下去是个不错的做法。我同意你所说的一切,除了控制器的工作是从模型中获取数据并将其传递给视图的部分。视图也可以做到这一点。控制器的工作是接受请求。很抱歉,我错误地将答案放在这里(打开了多个选项卡)。从CI v2开始,我的控制器应该扩展CI控制器。看见