【问题标题】:PHP MVC view loopingPHP MVC 视图循环
【发布时间】:2010-01-13 22:59:05
【问题描述】:

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

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

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

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

    $tpl->render();
}

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

帮助?

【问题讨论】:

    标签: php model-view-controller separation-of-concerns


    【解决方案1】:

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

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


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

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

    这意味着,如果您的 blog 对象发生更改,您只有一个 View 可以编辑 (添加或删除内容),您不必修改对它的每次调用查看以添加/删除$blog 的一个组件/属性。

    【讨论】:

    • 干得好,我喜欢。实际上 - 我就是这样做的,但我忽略了说明正在传递的对象,因为我不确定那是否是犹太洁食。感谢您为我节省了另一个问题!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-06
        • 2011-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多