【发布时间】:2010-12-12 22:02:38
【问题描述】:
目前,我正在重组现有的代码库。我是 php 框架的新手,但我大致了解 MVC 的工作原理。
目前,有 1 个控制器文件、1 个模型文件和 30 个视图文件。
每个模型都应该对应一个表吗?
每个视图都应该对应一个html页面吗?
控制器呢?我怎样才能把这个千行怪物分解成更有条理的代码。
谢谢。
【问题讨论】:
标签: php model-view-controller frameworks
目前,我正在重组现有的代码库。我是 php 框架的新手,但我大致了解 MVC 的工作原理。
目前,有 1 个控制器文件、1 个模型文件和 30 个视图文件。
每个模型都应该对应一个表吗?
每个视图都应该对应一个html页面吗?
控制器呢?我怎样才能把这个千行怪物分解成更有条理的代码。
谢谢。
【问题讨论】:
标签: php model-view-controller frameworks
每个模型都应该对应一个表吗?
没有。模型通常由来自多个来源的数据构建。不要考虑将其与您的物理数据库结构联系起来,即使最终可能会有很多相似之处。
每个视图都应该对应一个html页面吗?
听起来并不老套,但每个视图都应该对应一个视图。我不确定您所说的“页面”到底是什么意思。
也许一个例子会很有用。想象一个用户注册页面。该模型是用户,可能包含以下字段:
现在,这些数据可能位于多个表中。例如:Party、Person、Contact 和 Address。
大概会有几个视图:
通常所有这些都将由单个控制器处理,因为所有过程都是相互关联的。
【讨论】:
每个模型都应该对应一个逻辑数据对象 - 通常应该主要存储在一个表中(通常与其他表的外键一起使用,因为模型通常需要引用其他模型)。
每个视图都应与查看数据的逻辑方式相对应(例如,在 stackoverflow 上,希望有一个用于标记页面列表的视图、一个用于标记页面列表的视图等)。
每个控制器都应对应于视图的逻辑分组,该视图不应太大(其中 太大 是文件变得难以管理的行 - 如果您有 30 个视图,您希望能找到一种合乎逻辑的方法将它们分组为 3 个控制器)。
【讨论】:
控制器呢?我怎样才能 将这千行妖兽分解成 更有条理的代码。
看看CakePHP 框架以及它如何解决大型模型、控制器和大量视图的问题。我觉得它很优雅。复杂模型可以有行为。大型控制器可以分解为组件。许多视图都用 layouts 分组,同时将公共位分隔为 elements。一开始可能听起来很复杂,很吓人,但一旦你尝试使用它,它就会真正到位。
【讨论】:
每个模型都应该对应一个 桌子?
这不是必须的,但通常取决于您的业务逻辑的复杂性。
由于您要重构现有应用程序,请考虑其他层如何使用该模型。在 MVC 中,模型位于依赖堆栈的底部。
视图将如何访问模型?控制器将如何修改它?模型将如何填充?
是否每个视图都对应一个 html页面?
同样,它不是必须的,但它经常会。
控制器呢?我怎样才能 将这千行妖兽分解成 更有条理的代码。
一种常见的策略是使用前端控制器模式。前端控制器处理 HTTP 请求、应用程序初始化和站点范围的逻辑(就像你的千行怪物目前正在做的那样) - 但随后它委托给更专业的控制器。
这些专用控制器可以按其使用的模型、站点页面结构或任何其他看起来合乎逻辑的内容进行分组。然后他们与模型交互并选择要显示的视图。
最后,正如 Leonid 建议的那样,对框架 +1。即使您最终没有使用,也有一些很棒的控制器模式实现。
希望对您有所帮助。
【讨论】: