【问题标题】:Working with View-related For Loops in MVC在 MVC 中使用与视图相关的 For 循环
【发布时间】:2012-09-01 18:39:01
【问题描述】:

这两条经常被提及的 MVC 建议似乎相互矛盾:

  1. 视图中没有 for 循环或条件逻辑
  2. 除了视图之外没有 HTML

假设我有 $items 必须作为无序列表输出。迭代逻辑不是必须有html吗?在这种情况下,我应该把它放在哪里?

在我看来,可重用性主张把它放在视图以外的地方,同时为模板作者提供标签、类等参数。

你怎么看?你为什么这么认为的实际原因是非常受欢迎的。

【问题讨论】:

    标签: model-view-controller design-patterns


    【解决方案1】:

    当然,您可以在视图中放置循环 - 您还打算如何渲染 <ul>s? :))

    你也可以放一点条件逻辑,例如根据授权状态在右上角打印“注销”与“登录”,主要在模板的共享部分。

    关键是视图层必须完全不知道它呈现的数据:他是一堆数组/对象和浏览器中呈现的实际 HTML 之间的一个造物主。 提供此类数据是控制者的事情,即做出所有决定、过滤内容等等。

    想想 web 服务:你可以用不同的格式渲染 same 资源 [xml, json, plain html] - 它是从任何地方获取数据的控制器,然后视图获取它并渲染一个正确的文件。

    【讨论】:

    • “当然你可以在视图中放置循环” 是的,我也一直这么认为,但我看到有人在这里说其他话。它似乎确实创建了许多跨视图的冗余代码。
    【解决方案2】:

    在处理视图模板上的列表和表格时,您总会遇到某种循环。您听到人们争论在模板中添加视图逻辑是个坏主意的原因与 ViewModel 范例有关。

    有时仅循环遍历数据是不够的,例如:

    <?php foreach( $users as $user ): ?>
        <?php if ( in_array( $user->getId(), $members ) ): ?>
        <!-- Users is member -->
    

    在这种特定情况下,user entity 没有方法 isMember() 来检查用户是否是成员。假设您使用的是用户实体附带的第 3 方模块,并且您不想扩展它以添加新的依赖项(例如组)。您必须在域模型之外进行检查,以便如上例所示正确显示视图模板。

    但是,在这种情况下,我们向视图添加逻辑if ( in_array( $user-&gt;getId(), $members ) )。您应该将其放在您的业务逻辑视图逻辑中。后者是使用 ViewModels 实现的。因此,您的视图不会与域模型对象交互,而是会与 ViewModel 交互,后者将实现 isMember() 方法并封装上述逻辑。

    此范例的主要思想是您的视图无法访问域模型,而是仅与 ViewModel 交互,保持视图独立于域模型。

    更新

    例如,如果您有设计/前端团队,您将不允许他们调用 $user-&gt;setName(),而只允许使用 ViewModel 调用 $user-&gt;getName(),您将不会将此方法作为选项包含在内.

    还有另一个例子:假设您的应用程序有皮肤/主题。如果您保留视图逻辑,如视图模板的第一个示例中所示,则需要为所有具有类似模板的主题复制此逻辑。将您的模板解耦后,您将避免重复的视图逻辑分布在您的视图模板中。

    【讨论】:

    • ViewModels 似乎让我们进入了纯粹的命名领域。 ViewModel 是什么,与 View 相关联的次要逻辑任务的函数集合?在实践中,而不是在理论方面,这如何在仅将逻辑填充到模板中进行改进?
    • 我希望看到有人采用真正常见的 Web 应用用例并描述最佳处理位置的哪些部分。
    • @MikeGirard 让我知道更新的答案是否能解决您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2017-02-19
    相关资源
    最近更新 更多