MVC,课程在哪里?

时间:2008-09-26 09:46:16

标签: php model-view-controller oop

我对MVC的理解如下(因为它非常错误,我以后是新手)

  1. 模型是与数据库交互的东西
  2. 视图是页面的设计/布局
  3. 控制器是一切开始的地方,本质上是页面逻辑
  4. 我正在使用CodeIgniter,但我猜测它不仅限于此,甚至可能仅限于PHP框架。

    我在哪里放置全局课程?

    我可能有一个产品模型,然后运行一个从数据库中收集20个产品的查询。我现在制作20个模型还是应该为它设一个单独的类,如果是后者,我在哪里放这个类(其他控制器也需要使用它)

5 个答案:

答案 0 :(得分:4)

在讨论如何处理产品时,模型是错误的用法:每个产品都是价值对象(VO)(或数据传输对象/ DTO,更好地适合您的口腔)。值对象通常具有表包含的相同字段。在您的情况下,ProductVO应该具有Products表中的字段。

模型是数据访问对象(DAO),其方法类似于

findByPk --> returns a single value object
findAll --> returns a collection of value objects (0-n)
etc.

在您的情况下,您将拥有类似上述方法的ProductDAO。然后,ProductDAO将返回ProductVO及其集合。

数据访问对象还可以返回 Business Objects(BO),其中可能包含多个VO以及特定于业务案例的其他方法。

附录: 在您的控制器中,您可以致电ProductDAO以查找所需的产品。 然后将返回的ProductVO传递给视图(作为Java中的请求属性)。然后视图循环显示/显示productVO的数据。

答案 1 :(得分:3)

模型是业务逻辑发生的应用程序的一部分。模型表示对象之间的现实关系和依赖关系,例如:员工向Manager报告,Manager监督许多Employees,Manager可以将Task分配给Employee,Task在逾期时发出通知。模型CAN和大多数情况下DO与数据库接口,但这不是必需的。

查看基本上是可以显示或帮助显示的所有内容。视图包含模板,模板对象,处理模板组成和排料,以页眉和页脚包裹,并且在公知的格式(X / HTML,也XML,RSS / ATOM,CSV)。

一个产生输出

控制器是将用户操作转换为模型操作的转换层。换句话说,它告诉模型要做什么并返回响应。控制器方法应尽可能小,所有业务处理应在Model中完成,视图逻辑处理应在View中进行。

现在,回到你的问题。这真的取决于你是否需要为每个产品分别上课。在大多数情况下,一个类就足够了,应该创建20个实例。由于产品代表业务逻辑,它应该属于应用程序的Model部分。

答案 2 :(得分:1)

CakePHP中还有3个“部分”:

  1. 行为
  2. 部件
  3. 助手
  4. 许多模型使用的逻辑应该作为一种行为。我不知道CodeIgniter是否有这个逻辑,但如果它没有,我会尝试实现它。您可以阅读有关行为here的信息。

    (组件帮助控制器共享逻辑和帮助程序以相同的方式帮助视图)。

答案 3 :(得分:1)

最简单的方法是:

  1. 每个数据库表都有一个模型类。在这种情况下,它将是一个包含所有产品详细信息的对象。
  2. 将这些类放入包/命名空间,例如com.company.model(Java / C#)
  3. 将DAO类放入com.company.model.dao
  4. 这样的包中
  5. 您的视图将使用会话/请求/控制器中的数据在这种情况下,我将有一个List< Product&gt ;.
  6. 哦,你正在使用PHP。 Dunno如何改变事物,但我想它有一个像现代语言一样的收藏框架。

答案 4 :(得分:1)

@Alexander提到CakePHPs 行为组件助手。这些非常适合抽象出常见的功能。我发现行为特别有用,因为大部分业务逻辑都在模型中进行。我目前正在开展一个项目,我们的行为如下:

  • 可锁定
  • 可发布
  • Tagable
  • 应课差饷租
  • Commentable

对于甚至超越MVC框架的代码,即用于各种事物的代码库,这些代码库与您正在使用的特定框架无关 - 在我们的例子中,像视频编码类等等.CakePHP有供应商文件夹。

任何与CakePHP无关的东西都在那里。

我怀疑CodeIgniter没有一个非常灵活的结​​构,它比CakePHP更小更轻,但是快速查看CakePHP Manual以查看Behaviors,Components,Helpers和Vendors文件夹如何有用。

从模型中包含一些常见的帮助类并保持良好并且DRY

应该是一件容易的事。