【问题标题】:Proper Design of a MVC Project [closed]MVC项目的正确设计[关闭]
【发布时间】:2010-11-04 07:49:48
【问题描述】:

我已经使用 Kohana 几个月了,对于组织代码/演示文稿/db-layer 的 MVC 风格还是比较陌生。不幸的是,虽然有很多关于如何创建控制器、建立视图以及通过模型与数据库交互的文档,但我还没有找到很多处理干净和建议开发模式的资源。

让我举一个简单的例子:

我的最新项目有一个控制器,因为我不确定我是否应该制作更多……或者何时应该制作一个新的。我如何准确地确定何时需要新控制器以及何时需要新模型?

【问题讨论】:

    标签: php design-patterns model-view-controller kohana


    【解决方案1】:

    规则如下:当我识别出我的应用程序的一种新“项目”时。需要管理,我问自己这些问题:

    (1) 这类项目是否应该持久化?

    (2) 这个项目会有很多实例吗?

    如果对这两个问题的回答都是肯定的,我的结论是,所述项目应该是一个模型(或模型元素或域类,取决于您的 MVC 框架的术语)。当我定义一个新的模型元素时,我还为它定义了一个控制器,它将支持四种基本操作:创建、检索、更新、删除(您的框架可能会为您生成一个默认控制器)。

    【讨论】:

      【解决方案2】:

      您可能想要一份 Martin Fowler 的“企业应用程序架构模式”。 Web 演示部分广泛讨论了如何在使用前端控制器驱动的框架时构建代码,就像当前的任何 MVC 框架浪潮一样。

      【讨论】:

      • 你能告诉我他的建议吗?虽然我很感谢您的回复,但除了告诉我可以去哪里找到可能有用的材料之外,它并没有立即提供帮助。
      • 嗯,MF 将这本书分成了叙述和模式。叙述确实是您想要的,因为它们将模式置于上下文中并解释了您何时选择一种替代方案。这些模式本身非常简洁,但你可以在网上看到它们:martinfowler.com/eaaCatalog 我推荐这本书的原因是因为(1)它绝对是基础知识,尤其是网络演示模式; (2) 这是一本非常易读的第一本模式书; (3) 每个 MVC 框架都是使用 PoEAA 模式构建的(这可以追溯到 (1))。希望这会有所帮助
      • 回到您最初的问题:PoEAA 中的叙述讨论了如何做出“架构”决策,例如如何将代码划分为单独的类。例如,他的书在 Data Mapper 与 Active Record 区别方面非常出色,这是在将一个模型类映射到数据库中的每个表 (AR) 或具有额外的间接层 (DM) 以简化控制器之间的选择.
      【解决方案3】:

      我建议你先看看resource oriented architecture。这不会为您提供有关如何组织代码的任何直接指导。但是,在考虑资源时,在决定是否创建新控制器时会更容易。一旦您设法识别系统中的资源,为它创建一个模型和一个控制器通常是一件好事——尽管这只是一个经验法则。

      补充几点:

      • 查找资源并为每个资源创建模型和控制器(经验法则)
      • 不要害怕为不持久的资源创建模型
      • 将控制器视为将用户“连接”到业务域的“管道”或“线路” - 它们的作用是处理用户请求并将答案转发给他们 - 使它们尽可能精简

      【讨论】:

      • 所以听起来你们建议至少应该存在 1:1 模型与控制器的关系。对吗?
      • 没错。根据经验。有一些边缘情况不适用,但作为起点,遵守它就可以了。
      【解决方案4】:

      这是我在 Kohana 应用中所做的一个示例。

      我需要一个“最新消息”部分,因此我设置了一个名为“新闻”的控制器、模型和视图。

      我的新闻控制器有 index()feed()media_releases() 方法。

      我的模型由数据库查询组成,这些查询从 MySQL 数据库中获取我的新闻数据。

      而我的观点只是很多 HTML 和一些 <?php echo $title; ?> 之类的。

      【讨论】:

        【解决方案5】:

        您是否有理由不能定义一个通用系统,该系统可以在全球范围内利用数据库元数据?在我看来,通常编写任何代码来访问和显示简单数据都是不必要的冗余。

        【讨论】:

          【解决方案6】:

          我喜欢具有明确定义的功能或一组功能的小型控制器。这通常意味着每个页面(或一组类似页面)一个控制器。在我的 Kohana 网站上,CSSMySite 我有 about、blog、contact、css 和 post 控制器。

          关于控制器所做的只是设置模板。 博客控制器与博客模型交互以列出数据库中的多个帖子。帖子控制器与博客模型交互以显示数据库中的一篇帖子。

          只要我有持久的数据(博客文章)或多次使用的数据(下拉框的状态列表),它就会进入模型。模型可以被不同的控制器访问,因此它不必是模型到控制器的一对一映射。

          【讨论】:

            【解决方案7】:

            也许学习好的 MVC 编程的一个好方法是花一些时间在 Ruby-on-Rails 上。不久前我开始使用 Rails,作为间接结果,我相信我现在对 MVC 有了很好的理解。我将 Rails 视为 MVC 的缩影。至少,这可能是一种学习 MVC 的有趣方式……你会怎么想?

            【讨论】:

            • +1 感谢@tybro0103 的建议。问这个问题已经好几个月了,我必须说我同意你的观点,那时我会教我们什么是必须知道的。与撰写此问题时相比,我对构建项目的感觉要好得多。感谢您的参与!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-23
            • 2015-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多