【问题标题】:Why split the View in MVC into a view class and a template为什么将MVC中的View拆分成视图类和模板
【发布时间】:2012-10-25 21:20:31
【问题描述】:

我对设计模式比较陌生,但我觉得我对 MVC 模式以及这种代码分离带来的优势有了很好的理解。

但是,我两次都看到了 MVC 模式的实际应用(Magento 和 Joomla!),还有进一步的专业化,view 由一个视图类(Magento 块)和一个PHP 模板文件。如果有人能解释这种拆分的好处,我将不胜感激。

我也不知道如何在视图类和模板文件之间拆分我的代码。有时我发现自己编写了一个看似冗余的视图类(在 Joomla 中!),它只是访问模型,然后使数据可用于模板。模板中应该出现什么代码,视图类中应该出现什么代码?

【问题讨论】:

    标签: php model-view-controller magento design-patterns joomla


    【解决方案1】:

    在一般情况下,“视图”和“模板”之间的分割是这样的,如果您要通过不同的方法呈现视图数据 [即。 HTML, XML, JSON, etc.] 那么你不需要继续重写'View'类,只需要创建新的'Template'类。如果您想将 AJAX 调用合并到前端,或者从其他应用程序(例如智能手机应用程序)进行调用,这将非常有用。

    【讨论】:

      【解决方案2】:

      您可以将view 视为what,将模板视为how

      视图通过使用模型准备数据并将这些数据提供给模板。

      反过来,模板通常在视图的范围内被调用(至少在 Joomla! 中)。

      一开始这似乎有点多余,但是当使用 模板覆盖 时,这种方法的威力就显现出来了。然后,可以单独保留视图,仅覆盖模板(或子模板,就此而言)。

      即使使用相同的主 (Joomla!) 模板,您也可以指定不同的 视图模板 作为参数,以防您需要一些专门的演示文稿。这也消除了代码重复

      例如,假设您创建了一个新的主模板。您可以覆盖一些默认视图/模板,而其他一些则保持不变。然后,您可以创建一个新的视图,例如,博客视图,以及 2 个模板,light spaceddark dense ,用于两种不同的场景。这样,您只有一个视图来准备所有 what 和几个不同的模板来处理 how

      【讨论】:

      • 我认为 MVC 范式的全部意义在于,模型是 what,视图是 how
      • 我的编辑在五分钟规则中丢失了,上面的其余部分应该阅读。据我所知,在使用 Joomala 时!有三个区域控制模型中的内容应该如何呈现,它们是:1)视图 2)模板和 3)样式表。您能否提供一个示例来说明演示文稿应如何以及为何在这些位置之间进行分区。
      • 您可以找到内容覆盖的解释,这是这种分离的最常见用例,here。甚至您默认安装的模板也具有内置覆盖。视图用作获取数据并将其分配给变量的通用代码,然后调用渲染部分,即视图的模板(在 Joomla 中称为layout)。更简短的解释可以在here找到。
      【解决方案3】:

      阅读此http://www.codinghorror.com/blog/2008/05/understanding-model-view-controller.html。对我来说,MVC 意味着将一个函数注册到一个数组并循环遍历该数组并最终在主程序中调用一个函数。但对于许多人来说,似乎将模型(数据库)与视图(html 模板)和控制器(主应用程序)分开。但这不是我认为程序的特别之处。当您开发Web应用程序时,您自然会拥有所有这些后端,例如数据库,浏览器,后端和前端,html,css,图像文件,视频文件和php语言等。为什么用复杂的语言来混淆开发?我认为 MVC 通常是有用的。学习装饰器模式,它更有用。

      【讨论】:

        【解决方案4】:

        说实话...性能的最佳选择是在后端创建 Web 服务并使用 javascript 库与服务器通信。 joomla 和其他 cms 发行版试图将这两种设计模式抽象到 MVC 中,从而导致 MVC 和 Web 服务/客户端代码的混合。这种混合性质允许将扩展扩展到 javascript 领域,这似乎是 Web 的发展方向。

        【讨论】:

        • 这与视图和模板的分离有什么关系?
        【解决方案5】:

        视图,在受 MVC 启发的设计模式中,负责所有的 UI 逻辑。他们应该从模型层请求信息,并根据他们收到的信息,选择应该使用哪些模板来创建响应。或者即使需要任何渲染(视图也可以只发送一个 HTTP 标头)。

        你可以说在经典的 MVC 和 Model2 MVC 模式中,视图只从模型层读取,而控制器只向它写入。

        如果您从模型层收到一些错误状态,视图将采用主布局模板并补充它的模板,该模板包含错误消息的 HTML 片段。然后它将整个内容组合起来展示给用户(在 Web 应用程序的情况下是浏览器)。

        在您的基本 Web 应用程序中,模板只是包含标签和 php 变量的简单文件。

        【讨论】:

        • 视图不应向模型请求数据。控制器从模型请求数据并使其(部分)可用于视图。 View 的职责是使用 Controller 暴露的数据来渲染模板
        • 是的,不要相信 SO 上有 only MVC Gold Badge 的人
        • @MihaiRăducanuthis (slightly newer) post 可能会帮助您了解我的方法背后的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        相关资源
        最近更新 更多