【问题标题】:Structuring models in MVC framework?在 MVC 框架中构建模型?
【发布时间】:2011-03-10 08:41:33
【问题描述】:

我想知道这方面是否有最佳实践,我正在构建一个需要很多模型的网站,而且我不希望最终出现非结构化的混乱局面。基本上我正在寻找一个好的规则表来构建模型。目前我只能想到两种方式:

  • 数据库中的每个表都有自己的模型,即。 accounts.php、books.php 等。
  • 模型表示方法的集合,属于网站的核心模块,即。包含登录、注销等方法的登录模型 处理会话的模型、处理 cookie 的模型

感谢您的宝贵时间!

【问题讨论】:

  • 顺便说一句,cookie 处理通常不是由 MVC 中的模型完成的。这看起来更像是控制器使用的辅助类或方法,因为设置 cookie 并不是真正的业务逻辑。一般来说,模型应该是应用程序的可移植部分,并且不应该直接与客户端通信。

标签: php model-view-controller


【解决方案1】:

唯一可能导致模型文件夹混乱的想法是,如果您的应用程序变得越来越大,而您的框架不允许您在子文件夹中构建模型,或者您没有这样做。

试用 ORM。它有非常严格的规则,所以你的结构不会出错。

【讨论】:

  • 谢谢,TomWilsonFL 也回答了这个问题,我的回答是:我正在使用 CodeIgniter,它对任何最知名的 ORM 都不太满意。否则,这绝对是我的方法
【解决方案2】:

ORM 之类的 Doctrine 可以极大地帮助保持秩序,但确实会增加开销。

请记住,模型应该是 MVC 结构中唯一与数据库对话并包含核心业务逻辑的部分。只要你坚持这条规则,你就走在了正确的轨道上。

【讨论】:

  • 谢谢。我正在使用 CodeIgniter,它对任何最知名的 ORM 都不太满意。否则,这绝对是我的方法:)
  • @soren:实际上我现在有一个使用 CI + Doctrine 的大型项目。有关于如何集成它们的文档,而且还不错。这是旧的,但我相信这是我们进行了一些小的调整:doctrine-project.org/blog/using-doctrine-with-codeigniter
  • 非常感谢,我去看看
【解决方案3】:

我 suggest 那个 model != table 一般。

相反,模型代表应用程序域逻辑的某些组件。这可能有时与数据库表一一对应,但也可能是一个模型由多个数据库表组成,或者没有数据库表。一些模型可以由其他模型的集合组成。此外,一些表可能会在多个模型类中使用。

模型和表之间的一对一关系对于简化应用程序很有吸引力,但它是一种可能会产生误导的耦合。

在 MVC 中,Controller 和 View 相对简单明了。它们对应于处理输入和生成输出。模型很难,因为这是应用程序的其余数据和逻辑。欢迎来到 OO 设计和架构!

Eric Evans 的 Domain-Driven Design 是学习如何有效构建模型的好资源,或者免费的在线短版 Domain-Driven Design Quickly。

【讨论】:

  • 谢谢,我想这就是我想要的。当您有跨表关系并且不使用 ORM 时,Model=Table 方法也是一个令人头疼的问题。
  • 别忘了domaindrivendesign.org 和Sample App - 虽然我希望有人将示例移植到 PHP。
  • @Gordon:感谢您的参考!
【解决方案4】:

这很难回答。看看我对类似问题的一些回答

一些想法。但基本上,所有这些都主要引用Patterns of Enterprise Application Architecture,所以你也可以缩短它们。


我将其标记为社区 Wiki,因为它只引用了一些答案。随意对他们投票而不是这个答案。

【讨论】:

  • 非常感谢!我会检查这些问题
  • @soren,不客气。我想您应该首先找出 POEAA 中的哪个 Domain Logic Pattern 最适合您的项目。
【解决方案5】:

每个表的模型是迄今为止最常见的方式。我认为也是最干净的。你的第二种方法最终会变成一团乱麻。

但我认为他们最终都会变得相同。因为您可能只会在会话模型中触碰一张表,在登录模型中触碰一张等等。

【讨论】:

  • Web 应用程序必须非常简单,甚至不使用两个表之间的单一关系。
  • 同意 - 即使是用户/组的基本示例 -> 我几乎肯定会在我的应用程序的某个地方设置一个用户模型,该模型执行“SELECT U.somevalue FROM users U, groups G 其中 U.group_id = G.group_id
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2011-07-22
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多