MVC大型网站,使用一个控制器还是多个?

9

我有一个非常大的网站,我正在寻找最有效的方法来管理它(我是唯一的编码人员)。

我正在尝试设计一个非常简单的MVC结构(我不想使用框架),以帮助保持所有代码的顺序。

对于一个庞大的网站,是更好只有一个控制器来处理所有页面,还是将它们分开更好、更容易?

如果只有一个控制器,有没有一个非框架控制器的好例子?


1
你为什么想避免使用框架?虽然有些框架很限制(只能按照“这种”方式来做,否则你就要费尽心思地去hack它),但也有些框架非常灵活(可以挑选喜欢的部分)。 - Tim Lytle
2
我主要想避免使用框架,因为我有自由和时间来实现自己的想法。在开始使用框架之前,我真的很想亲身体验一下从零开始的开发过程。另外...总的来说,我不想使用比我需要的更多的东西。 - johnnietheblack
5个回答

4
我会将任何逻辑分割为不同的控制器 - 如果它们都是静态页面,那么请使用所有相同的“静态页面”控制器来提供服务。
如果您有一些静态页面,常见问题页面(或部分),产品列表,则使用每个不同部分的控制器。因此,静态页面将由一个控制器从平面文件或数据库中获取,FAQ页面将由另一个控制器从FAQ表生成,产品和信息将通过其来源生成。
每次页面生成方式或访问数据时,请使用不同的控制器。
当然,可以使用类继承来创建具有任何控制器所需代码的基类。
我不确定您所说的非框架控制器是什么意思 - 我会查看Zend(惊叹)“框架”,MVC模式以及控制器本身,可以脱离框架的其余部分使用。

4
我倾向于根据控制器对特定站点/应用程序部分的职责进行拆分。这使得维护代码变得更加容易。此外,我会将控制器(和视图、模型)分组在模块(文件夹)中。这是我正在处理的当前项目的一个示例:
- 博客 - 帖子 - 评论 - 类别 - 设置 - 帖子 - 用户
站点越复杂,我使用的模块就越多。虽然我的大部分模块只包含一个“Index”控制器,但我喜欢它们提供的组织结构。
然后我使用路由器(前端控制器)将REST风格的URI映射到正确的模块/控制器/操作上。例如:mysite.com/blog/posts/view/7将从“blog”模块调用Controller_Posts::view(7)。使用模块的另一个好处是我可以拥有比没有模块更具体的URI。虽然我认为这可以通过使用支持定义自定义路由的路由器来解决,但我不太喜欢那样做。
像许多其他事情一样,这归结为作为开发人员您的舒适区域,但我们可能都认为,您拥有的组织越多,您就越好,只要您不要过于复杂化。
顺便说一下,我建议您研究使用框架。如果您不想使用已经存在的框架,我可以理解,因为我也避免使用它们。我最终编写了自己的框架,至今已经为我服务了一年。这是一个很好的学习经验,它只包含我想要/需要的东西。话虽如此,您可能需要研究Kohana和CakePHP-它们在我看来不会过于臃肿,并且如果您决定不编写自己的框架,它们肯定会为您节省时间。

3

通常人们将控制器分成专注于特定功能区域的控制器。

然后他们在所有控制器前面放置一个“前端控制器”,这样应用程序只有一个入口点。前端控制器唯一的任务是将传入的请求路由到适当的控制器。

查看Zend_Controller组件的设置方式。它可能提供您所需的一切,并且您可以自由使用它,而无需购买完整的Zend框架。


1

这取决于其他部分的工作方式。如果你只有一个模型文件,那么也许没有必要拆分控制器。如果您可以将模型分成几个部分以及控制器,那么就这样做。

然而,我经常发现模型之间存在太多重叠,无法将它们分开。你可能有一篇文章的模型,但如果你想在其他页面的侧边栏中显示前20篇文章,那么代码应该在文章模型中 - 你需要在每个页面都用到它。

不过,说实话,唯一的方法就是尝试并查看效果。从一个单一的进入点开始,如果变得太过繁琐,则将其重构为更小的块。


1
一个路由器/调度器,多个控制器是我的建议。控制器应该映射到URL,这意味着不同的功能。每个用例都需要控制器与不同的服务协作完成,因此如果您的应用程序具有多个用例,那么为整个应用程序使用一个控制器将变得过于笨重。

如果我有几百页...我该如何使用路由器?它只是一个巨大的switch()吗? - johnnietheblack
1
Spring通过将URL映射到控制器来实现这一点。也许你需要一个类似的映射器。使用switch语句会很脆弱。 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接