Php 在另一个视图中使用变量调用视图是否违反MVC模式?

Php 在另一个视图中使用变量调用视图是否违反MVC模式?,php,model-view-controller,codeigniter,seo,Php,Model View Controller,Codeigniter,Seo,为澄清和修改示例伪代码而编辑 我试图理解mvc的概念,有时它会让我头疼不已 我面临着一个问题,并试图想出一个解决办法。我正在使用codeigniter,问题是如何在我的网站上为不同的类别和搜索创建不同的页面标题和描述 以下是我认为的解决方案(我知道这不是演示它的最佳方式,但不要拘泥于细节,只要看看基本想法): 控制器 $data['results'] = call model and get results this->load->view(ad_details,$results

为澄清和修改示例伪代码而编辑

我试图理解mvc的概念,有时它会让我头疼不已

我面临着一个问题,并试图想出一个解决办法。我正在使用codeigniter,问题是如何在我的网站上为不同的类别和搜索创建不同的页面标题和描述

以下是我认为的解决方案(我知道这不是演示它的最佳方式,但不要拘泥于细节,只要看看基本想法):

控制器

 $data['results'] = call model and get results
 this->load->view(ad_details,$results);
广告类别视图:

foreach ($results as $key => $row) {
        $ad_title = $row->title; 
        $ad_id = $row->id;
        $ad_price = $row->price;
        $ad_status = $row->status;
        $ad_city = $row->city;
        $ad_user = $row->user;
        if ($key<1) {
          // let's be sure even customers enter same info we got unique titles and descriptions for search engines 
         $data['title'] = "$ad_title $ad_id $ad_price";
         $data['description'] = "Second Hand Autos for $ad_status from $ad_user in $ad_city";
         this->load->view(header,$data);
         <body>
        }
      $ad_description = $row->description; 
      <h2>$ad_title</h2>
      <p>$ad_description</p>
      }
      </body>
     <? this->load->view(footer); ?> 
foreach($结果为$key=>$row){
$ad_title=$row->title;
$ad_id=$row->id;
$ad_价格=$row->价格;
$ad_status=$row->status;
$ad_city=$row->city;
$ad_user=$row->user;

如果($key通常,您希望有一个模型-一个视图,通过某个控制器控制关系和数据/流。控制器可以管理多个模型和视图,但每个不同的视图都应该有相应的模型


阅读ASP NET MVC是一个好主意。

因为MVC是一种设计模式,而不是语法规则,所以您在这里有一定的自由度。我认为在视图中使用视图没有什么错,不仅在CI中是可能的,而且经过深思熟虑,您可以调用不同的视图并嵌套它们,而无需通过“secondary”查看它的数据集,因为视图是缓冲的,并且它们对所有人都可用

因此,您可以执行以下操作:

控制器:

$data['results'] = $this->your_model->get_details();
// this will be in the form of an array returned directly from the model 
// i.e. the model code would look someting like:
// $data = array();
// foreach($query->result() as $row)
// {
//   $data[] = $row;
// }
// return $data;

$this->load->view('ad_details',$data);
在ad_details.php中:

<?php $this->load->view('header');?>
<!-- html code -->
<? $this->load->view('footer'); ?>


如果对其进行var_dump(),您将看到header.php和footer.php现在都有一个变量$results,而不必再次传递它。

在控制器中处理您的逻辑

$data['results'] = call model and get results
$this->load->view(ad_details,$results);
foreach ($results as $key => $row) {
    if ($key<1) {
      // let's be sure even customers enter same info we got unique titles and descriptions      for search engines 
     $data['title'] = "$ad_title $ad_id $ad_price";
     $data['description'] = "Second Hand Autos for $ad_status from $ad_user in $ad_city";
     this->load->view(header,$data);
    }
this->load->view(body, data);
通常,这意味着循环和条件决定要显示的内容不在视图中。视图可以使用逻辑决定如何显示内容,循环创建表等

把这些都放在控制器里

$data['results'] = call model and get results
$this->load->view(ad_details,$results);
foreach ($results as $key => $row) {
    if ($key<1) {
      // let's be sure even customers enter same info we got unique titles and descriptions      for search engines 
     $data['title'] = "$ad_title $ad_id $ad_price";
     $data['description'] = "Second Hand Autos for $ad_status from $ad_user in $ad_city";
     this->load->view(header,$data);
    }
this->load->view(body, data);
$data['results']=调用模型并获取结果
$this->load->view(广告详情,$results);
foreach($结果为$key=>$row){

如果($keyEdit:我从阅读此评论中了解到,您不能在CodeIgniter中使用
$results[0]
,您必须使用
$results->row()
显然-我保留我的答案,因为它不应该是100%特定于CI的,但请记住


以下是我写下你观点的方式:

<?php $this->load->view('header', array(
  'title' => $results[0]->title.' '.$results[0]->id.' '.$results[0]->price,
  'description' => 'Second hand autos for '.$results[0]->status.' from '.$results[0]->user.' in '.$results[0]->city
)); ?>
<body>
  <h2><?php echo htmlspecialchars($results[0]->title); ?></h2>
  <p><?php echo htmlspecialchars($results[0]->description); ?></p>

  <?php foreach($results as $row): ?>
    <!-- Deal with results -->
  <?php endforeach; ?>
  </body>
 <? this->load->view('footer'); ?>
$r = $results[0];

再说一次,你可能不会。不管你的鸭子叫什么。:)MVC是为了让您的生活更轻松,开发更快,如果您不能从控制器级别调用它,并且允许在视图内部调用它,那么就这样做。

这不是违背了“不要重复自己”的座右铭吗?我是否每次都必须编写页眉和页脚部分?如果每个页面都使用相同的模型,那么是的,但是如果每个页面都使用不同的模型,因此您不应该使用相同的视图。我认为您应该移动逻辑(
$data['title']
)但是对控制器来说。在一个控制器方法中使用多个视图没有什么害处。视图实际上是呈现页面的可视模板,您的页面可以由任意数量的组件组成,如页眉、页脚、边栏等。我在视图中遵循的唯一规则是我不转换数据或进行任何业务逻辑处理,这应该是在控制器上完成。使用多个视图不是重点。重点是我试图避免在每个不同的控制器中使用多个相同的foreach循环。例如,如果我不以这种方式连接视图,这意味着我必须在headers.php中使用$result的foreach循环来准备$title、$description、$keywords变量和第二个fo达到$results的循环。这不是违背了“不要重复自己”的座右铭吗?哦!在这种情况下,请使用CI中的库。将所有外观相似的代码移动到库中,并在需要时加载它们并调用该方法。例如,您可能有一个库方法,它实际上超越了页面的默认元数据,比如搜索结果页面。但我不能t从标题视图访问“$title$description$keywords”变量。我是否必须在每个视图中多次使用foreach循环?在控制器内部指定,或者如果数组只是一行(现在考虑一下,更好地查看代码)只是用户$result->titleme可能我应该更清楚地回答我的问题。我试图避免多次使用相同的foreach循环。这就是问题背后的原因,我不确定为什么多次使用相同的foreach循环更好,更符合逻辑。这是否意味着我应该在body视图中使用第二个foreach循环$result?不是吗这与“不要重复自己”的座右铭背道而驰?我一直在寻找一种方法,使我不必一次又一次重复相同的foreach循环。您目前有一个foreach来处理正文和广告吗?我只是将它们移到另一个层。您的代码将与问题一样复杂……我编辑了示例以澄清问题。可能是这样第一个版本很模糊。可能只有一行,但大多数情况下,每页可以有15个广告。比如:我想我必须使用数组而不是对象,因为我在你的解决方案中遇到了这个错误:致命错误:无法使用CI_DB_mysql_类型的对象作为数组结果。我想我已经找到了解决方案:不是exa很明显是你的,但与之非常相似,因此你可能想就这一点发表你的看法:根据codeigniter的有用手册“-row()或row_array()“只能用于获取sql结果集中的一行。你可以责怪我对CodeIgniter不熟悉。谢谢,我将进行一些编辑,让阅读我的答案的任何人都能清楚地看到它。:)