什么是适当的MVC方式来做到这一点......?

时间:2009-11-15 12:26:49

标签: php model-view-controller codeigniter kohana

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

我是MVC的新手并且不想弄错...所以我想知道我是否有桌子:

categories, pages, notes

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

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

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

谢谢,

了Serhiy

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

然后在您的视图中,您遍历$page_data['notes']并为每个显示HTML。如果列表视图使用与“show”视图相同的“note”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的所有视图都可访问的辅助方法。有意义吗?

答案 2 :(得分:0)

  1. 您可以在视图中循环。允许View也可以访问MVC中的模型。请参阅:http://www.phpwact.org/pattern/model_view_controller
  2. 您不需要为每个表都安装控制器(或模型)。

答案 3 :(得分:0)

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

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

<强>应用/助手/ 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个单独的音符。