2

我有一个“博客预览”模板——它基本上只是一个缩略图、标题和所述博客的简短摘录,采用简洁的结构,可以在列表中重复。

如上所述,我打算从我的模型中的数据库中提取我网站上的前 10 个博客,将它们传输到控制器,控制器将提供它们作为视图。在视图中,我需要遍历结果并为每个博客填充一个新的“博客预览”。

我当前的解决方案(我认为这可能会违反 MVC 的规则)是在视图模板中执行此操作:

foreach($this->blogs as $blog) {
    $tpl = new Output_Html();
    $tpl->title = $blog['title'];
    // ...assign other vars

    $tpl->render();
}

不知何故,这感觉像是不应该允许视图做的事情?但是,我还能如何循环浏览主页模板内的“预览”模板?

帮助?

4

3 回答 3

2

考虑到视图负责生成输出,您在这里所做的似乎还可以:您没有在视图中做任何“计算/业务事情/类似的事情”。

我唯一的问题是你在这里写了很多代码;我宁愿将$blog数组/对象作为一个整体传递给视图,让视图处理它——而不是将每个属性分配给$blog视图。


即这样的东西看起来(只是一个想法——由你来看看它如何适合你的 View 类)更漂亮:

foreach($this->blogs as $blog) {
    $tpl = new Output_Html();
    $tpl->blog = $blog;
    $tpl->render();
}

这意味着,如果您的blog对象发生更改,您只有一个视图可以编辑(添加或删除内容),并且您不必修改对该视图的每次调用以添加/删除$blog.

于 2010-01-13T23:22:42.303 回答
1

控制器的职责是处理输入并将模型设置为某种状态。您的视图的职责是渲染模型。所以,我想说,这样做是可以的。这就像渲染局部视图或使用 ViewHelper。View Helper 封装了动态业务数据的表现逻辑。

于 2010-01-13T23:05:02.570 回答
0

我同意帕斯卡。无需在控制器上执行该操作,只需将其传递给 View 并在那里完成其余的工作。让控制器接受输入,通过模型对其进行预处理,然后为视图准备一切。这样,您仍然可以确保代码的可维护性。

于 2010-01-14T01:50:33.360 回答