【问题标题】:PHP MVC Best Practices/"Rules" for Success [closed]PHP MVC 最佳实践/成功的“规则”[关闭]
【发布时间】:2009-11-10 23:58:22
【问题描述】:

我确定有人已经发布了这个问题;但是,我想获得有关 PHP 上 MVC 的各种建议。我知道有很多专家愿意与对其编码最佳实践有疑问的人分享他们的知识。

  • 您应该如何组织您的 Controller?
  • 你应该如何组织你的模型?
  • 控制器应该调用一个模型方法,模型调用子方法还是控制器调用所有模型子方法?

希望这可以帮助那里的人(因为它肯定会帮助我)。

【问题讨论】:

  • 尝试从一个简单的框架入手。让我指出您有据可查的 Codeigniter:codeigniter.com
  • 我发现当您了解模式本身后,选择 mvc 框架会容易得多。
  • 我正在使用 CodeIgniter,我不想制作自己的 MVC 框架之类的。只是想要一些关于它的提示。 :)

标签: php model-view-controller


【解决方案1】:

对于 php,我喜欢使用 CodeIgniter 框架。它为 MVC 设置奠定了基础。控制器保存在“/controllers”中,模型保存在“/models”中

我相信控制器应该调用模型并且模型应该尽可能地封装,如果需要的话使用子方法。这使您的代码更具适应性和灵活性。例如,今天您的模型正在从本地数据库中读取,明天您可能正在从 REST 服务中读取。模型应该将数据返回给控制器,并且控制器应该天真地了解模型内部发生的事情。

【讨论】:

    【解决方案2】:

    MVC 是最容易被误解的设计模式。根据定义,有一个模型。

    当城市规划师提出一个项目时,他会为其设计一个模型。模型可能包含的单独实体:建筑物、街道、公园,通常不会由单独的模型表示:它们都是单个模型的各个方面。

    所以在 MVC 中,模型可以由不同的实体组成,这可能是最适合它的词:实体,就像在由数据库表表示的实体中一样。 MVC 中的模型甚至可能比代码中实际表示的更抽象,而是应用程序可能需要对其进行操作的所有数据的概念保护。

    考虑到这一点,如果这些实体有自己的方法,尤其是可能对应于 CRUD 方面(创建、读取、更新、删除)的方法,它们应该直接暴露给控制器,它的抽象级别太低了。这些构建块应该构建到更粗粒度的界面中,例如您可能会删除一条记录,但在删除后返回记录列表。控制器只需要访问执行上述所有操作的粗粒度方法。

    此外,为了将实体的方法直接暴露给控制器,可能会导致必须重写控制器以及实体类,如果发生变化,例如什么 ORM(对象关系映射)系统正在使用。我建议的中间层也是异常处理、日志记录和任何其他需要处理的此类管理的好地方。

    建议的更高抽象级别的方法层有时称为业务委托或“外观”,但这是我实际考虑的模型。希望这不是太理论化,对 OP 或其他读者有所帮助。

    【讨论】:

    • 优秀答案 +1 这实际上有很大帮助。人们使用 MVC 框架时没有考虑到这些重要信息。如果你还有什么要补充的,请做,因为我很想听到你的更多消息。
    • 我没有更多要补充的,只是这些想法通常可以在现有框架的上下文中应用
    • 您可以有一个模型用于网站,另一个用于博客,以及控制器。
    【解决方案3】:

    我找到了与您的问题相关的博客。

    https://r.je/

    博客作者 Tom Butler 指出大多数 MVC 框架允许 model-view 交互的方式是不正确的,并试图解释 在 MVC 中,视图应该直接访问模型举几个例子。

    他有一个有效的观点,但是 来自 Rails 背景,我发现很难接受view 直接访问model 的想法。

    【讨论】:

      【解决方案4】:

      MVC 的秘密在于“M”模型应该被创建和设计为一个 VIEWMODEL,而不是一个简单的模型。

      假设我们有下一个例子:当插入一个名为 Customer 的实体时,我们有一个表单:

      客户

      • IdCustomer
      • 姓名
      • 姓氏
      • 国家/地区。

      MVC 规则说我们应该将客户模型发送到视图。 但是,假设 Country 字段填充了一个组合框。然后,我们应该向 VIEW 发送一个国家列表。

      所以,我们将有下一个 VIEWMODEL

      客户视图模型

      • 客户
        • IdCustomer
        • 姓名
        • 姓氏
        • 国家/地区。
      • 国家/地区列表

      另外,通常表单并不像字段那么简​​单,它有按钮、标签/消息框等。应该在VIEWMODEL中建模

      【讨论】:

        【解决方案5】:

        我不确定你所说的“组织”是什么意思。

        控制器调用它需要的任何模型[s] 以获取传递给视图[s] 的信息。它(控制器)可以多次调用模型以获取不同的信息。

        尝试阅读:http://www.phpwact.org/pattern/model_view_controller

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-26
          • 1970-01-01
          • 1970-01-01
          • 2013-07-03
          • 1970-01-01
          相关资源
          最近更新 更多