【问题标题】:What's the proper MVC way to do this....?什么是正确的 MVC 方法来做到这一点......?
【发布时间】:2009-11-15 12:26:48
【问题描述】:

关于 PHP 中的一般 MVC 设计原则的快速问题,使用 CodeIgniter 或 Kohana(我实际上使用的是 Kohana)。

我是 MVC 新手,不想弄错这个...所以我想知道我是否有表格:

categories, pages, notes

我为每个控制器创建一个单独的控制器和视图...?所以人们可以去

/category/#
/page/#
/note/#

但是假设我还希望能够在每页显示多个笔记,从页面视图循环调用笔记视图会很糟糕。那么我应该创建某种函数来绘制笔记并将变量从笔记视图和页面视图中的循环传递给该函数吗?这是最好的方法吗,如果不是,我应该怎么做...?

谢谢,

赛尔希

【问题讨论】:

标签: php model-view-controller codeigniter kohana


【解决方案1】:

是的,不是只将 1 个实体(类别、页面、注释)传递给您的视图,而是传递一个实体列表。通过视图内的循环,您可以显示整个列表。 该视图可能会调用另一个知道如何显示一个条目的视图(或函数)。

【讨论】:

【解决方案2】:

我个人会对一个项目使用“显示”方法,对多个项目使用“列表”方法。在您的控制器中,您可以为“show”方法说$page_data['note'] = get_note(cat_id,page_id),为“list”方法说$page_data['notes'] = get_all_notes(cat_id)

然后在您的视图中,您循环遍历 $page_data['notes'] 并为每个显示 HTML。如果列表视图使用与“显示”视图相同的“注释”HTML,请创建一个模板或函数来吐出给定注释的 HTML:

// In your "list" view
foreach($n in $page_data['notes']){
    print_note_html($n)
}

//In your "show" view
print_note_html($n)

print_note_html 函数可以是 Notes 的所有视图都可以访问的辅助方法。有意义吗?

【讨论】:

    【解决方案3】:
    1. 您可以在视图中循环播放。允许的 View 也可以访问 MVC 中的模型。见:http://www.phpwact.org/pattern/model_view_controller
    2. 您不需要为每个表设置一个控制器(或模型)。

    【讨论】:

      【解决方案4】:

      在 CodeIgniter 中,我创建了一个单独的帮助文件,其中放置了返回 UI 元素标记的函数,这些元素可能需要在一个视图中多次包含。

      在您的示例中,我将创建一个函数来返回注释的标记。

      application/helpers/view_helper.php

      function note($note)
      {
          return '<div class="note">' .
              '<h2>' . $note->title . '</h2>' .
              '<p>' . $note->contents . '</p></div>';
      }
      

      我通常会自动加载这个帮助文件。然后在视图中我会做这样的事情。

      echo note($note);
      

      对于视图中的笔记列表,我会迭代调用此函数的列表。

      <div class="note-list">
      <?php foreach ($notes as $note) : ?>
          <?php echo note($note); ?>
      <?php endforeach; ?>
      </div>
      

      我发现在另一个视图中多次包含一个视图很慢。这就是我这样做的原因。

      编辑

      我刚刚研究了 CodeIgniter Loader 类,并且确定每次调用时都会执行 PHP 包含

      $this->load->view('view_name');
      

      这意味着如果您使用此方法显示 20 个注释的列表,您将执行 20 个单独的包含。

      【讨论】:

      • 该 html 应该在您的视图中。
      • 它在视图中。我刚刚将它重构为一个函数,因为它在视图中被多次使用。我本可以将它放在它自己的视图文件中,但我发现如果我这样做,它的运行速度会慢得多,因为该文件被包含了很多次。
      • :-( 你还在读我写的东西吗?我的意思是我可以把那个代码放在一个单独的视图文件中,但是如果我在一个页面中多次包含这个文件,代码运行速度很慢。我发现从函数生成标记并从我的视图文件中调用该函数更快。我看不出这违反了任何 MVC 原则。代码仍然在逻辑上在视图中。你说 CodeIgniter 锚函数不是视图的一部分?
      • 但是,正如原发帖人所问的那样,如果您想在多个视图中以一致的方式显示笔记怎么办?您必须在这些视图中复制代码。如果您必须更新标记,则必须在每个视图中进行更新。当然,将它放在一个地方是有意义的。在性能方面,我不明白进行这样的函数调用与执行数据库查询有何相似之处? :-S
      • 唯一的问题是,如果我将循环放在使用小部件的单独视图中......每次我去渲染小部件时(比如每页 20 次),它不会导致20 包括视图文件,并且必须渲染控件 20 不同的时间?这不会导致效率低下吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多