这是否违反了MVC模式在另一个带有变量的视图中调用视图


Is it against to MVC pattern calling a view in another view with variables?

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

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

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

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

控制器

 $data['results'] = call model and get results
 this->load->view(ad_details,$results);

ad_categories视图:

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); ?> 

header_view文件

<!doctype html>
    <head>
        <meta charset="utf-8">
        <title><?=$title?></title>
        <META NAME="description" CONTENT="<?=$description">
        <META NAME="keywords" CONTENT="<?=$keywords?>" >    
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <link rel="stylesheet" href="css/style.css">
        <script src="js/libs/modernizr-2.0.6.min.js"></script>              
    </head>
     <body>

实际的标题和描述可能会有很大的不同,可能会有一些例外,我可能不得不为不同的类别和不同的搜索页面使用不同的代码。那么,用这种方式来对抗MVC,或者有更好的方法吗?

通过这种方式,我试图避免在控制器或视图中多次使用相同的foreach循环。实际的标题和描述可能会有很大的不同,可能会有一些例外,我可能不得不为不同的类别和不同的搜索页面使用不同的代码。那么,这样做是为了对抗mvc,还是有更好的方法呢?

由于MVC是一种设计模式,而不是语法规则,因此您在这里有一定的自由度。我认为在视图中使用视图没有错,而且不仅在CI中是可能的,而且经过深思熟虑,您可以调用不同的视图并嵌套它们,而不必将其数据集传递给"辅助"视图,因为视图是缓冲的,它们无论如何都可以使用。

所以你可以做一些类似的事情:

控制器:

$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.hp:中

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

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

MVC可以让你的生活更轻松,开发更快,如果你不能从控制器级别调用它,并且允许它在视图中调用它,那么就这样做。

编辑:我从阅读评论中了解到,你不能在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'); ?>

在这里,你可以看到我已经消除了foreach循环,除了你实际依次处理每个结果的地方。话虽如此,我个人的观点是,你把"不要重复自己"的咒语说得有点过分了,以至于你为了它牺牲了代码的可读性/可维护性。如果将多个foreach循环合并为一个循环会使代码更难理解,请不要这样做

我还试图减少视图中PHP和变量赋值的数量,这通常是一件好事,但如果推得太远,也会带来不便。例如,您可能想通过在视图顶部执行以下操作来减少所有$results[0]->内容:

$r = $results[0];

再说一遍,你可能不会。不管什么东西叫你的鸭子。:)

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

读一读ASP.NETMVC是个好主意。

在控制器中处理您的逻辑。

一般来说,这意味着决定显示什么的循环和条件不在视图中。视图可以使用逻辑来决定如何显示内容、循环创建表等。

把这些都放在控制器里。

$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);