Php MVC项目的正确设计

Php MVC项目的正确设计,php,design-patterns,model-view-controller,kohana,Php,Design Patterns,Model View Controller,Kohana,我已经使用Kohana几个月了,对组织代码/表示/数据库层的MVC风格还是比较陌生的。不幸的是,尽管有大量关于如何创建控制器、建立视图以及如何通过模型与数据库交互的文档,但我还没有找到很多涉及干净的、建议的开发模式的资源 让我举一个简单的例子: 我最近的项目有一个控制器,因为我不确定我是否应该制作更多的控制器……或者什么时候应该制作一个新的控制器。我如何准确地确定何时需要一个新的控制器,以及何时需要一个新的模型?经验法则如下:当我确定我的应用程序需要的一种新的“项目”时。需要管理时,我会问自己以

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

让我举一个简单的例子:


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

经验法则如下:当我确定我的应用程序需要的一种新的“项目”时。需要管理时,我会问自己以下问题:

(1) 这类项目应该是持久性的吗

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


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

您可能想要一本Martin Fowler的《企业应用程序架构模式》。Web演示部分详细介绍了如何在使用前端控制器驱动的框架时构造代码,就像当前的MVC框架浪潮一样。

我建议您先看一看。这不会为您提供任何关于如何组织代码的直接指导。然而,从资源的角度考虑,在决定是否创建一个新控制器时,生活更容易。一旦您成功地识别了系统中的资源,为其创建一个模型和一个控制器通常是一件好事——尽管这只是一条经验法则

还有几点:

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

    • 以下是我在Kohana应用程序中所做的一个示例

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

      我的新闻控制器有方法
      index()
      feed()
      media\u releases()

      我的模型由从MySQL数据库获取新闻数据的db查询组成


      我的观点是很多HTML,其中包含一些
      之类的内容。

      有什么原因不能定义一个通用的系统来处理数据库元数据?在我看来,通常编写任何代码来访问和显示简单数据都是不必要的冗余。

      我喜欢具有明确定义的功能或功能集的小型控制器。这通常意味着每页(或一组类似页面)有一个控制器。在我的Kohana站点中,我有大约、博客、联系人、css和帖子控制器

      控制器所做的一切就是设置模板。 博客控制器与博客模型交互,列出数据库中的多篇文章。帖子控制器与博客模型交互,以显示数据库中的一篇帖子


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

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

      你能告诉我一些他建议的内容吗?虽然我很感激你的回答,但除了告诉我在哪里可以找到可能有用的材料之外,这并没有立即起到帮助作用。好吧,MF将这本书分成了叙述和模式。这些叙述确实是你想要的,因为它们将模式置于上下文中,并解释你何时会选择一种替代方案而不是另一种。这些模式本身非常简洁,但你可以在网上看到:我之所以推荐这本书,是因为(1)它是绝对的基础知识,尤其是web表示模式;(2) 这是一本可读性很强的第一本模式书;(3) 每个MVC框架都是使用PoEAA模式构建的(这可以追溯到(1))。希望这有助于回到您最初的问题:PoEAA中的叙述讨论了如何做出“架构”决策,如如何将代码划分为单独的类。例如,他的书在数据映射器与活动记录的区别上做得非常好,这是在将一个模型类映射到数据库中的每个表(AR)或具有额外的间接层(DM)之间的选择为了简化你们的控制器。所以听起来你们建议至少应该有一个1:1的模型-控制器关系。对吗?对。作为经验法则。在某些边缘情况下,这并不适用,但作为一个起点,遵守它就好了。+1谢谢你的建议,@tybro0103。问这个问题已经好几个月了,我必须说,我同意你的看法,那时候我会教给我们必须知道的东西。与我撰写这个问题时相比,我对构建我的项目感觉好多了。谢谢你叫我进来!