哪些代码应该在MVC结构中去哪里

时间:2010-05-07 03:58:58

标签: php model-view-controller design-patterns frameworks model

我的问题是在模型和控制器之间的某个地方。当我使用MVC只是为了crud(创建,读取,更新,删除)时,一切都很适合我。我为每个数据库表都有单独的模型。我从控制器访问这些模型,为了他们。例如,在联系人应用程序中,我在控制器(联系人)中有动作(创建,读取,更新,删除)以使用模型(联系人)方法(创建,读取,更新,删除)。

当我尝试做一些更复杂的事情时,问题就出现了。有一些复杂的过程,我不知道我应该把它们放在哪里。

  1. 例如,在注册用户进程时。我不能在用户模型中完成这个过程,因为我也必须使用其他模型(发送邮件,通过其他模型为用户创建其他记录),并通过其他模型进行大量复杂的验证。
  2. 例如,在一些复杂的搜索过程中,我必须访问许多模型(文章,视频,图像等)。
  3. 或者,有时,我必须使用apis来决定接下来要做什么,或者使用哪种数据库模型来记录数据
  4. 那么在哪里可以完成这个复杂的过程。我不想在控制器中执行它们,因为有时我也应该在其他控制器中使用这些过程。而且我不想把这些过程放在模型中,因为我使用模型作为数据库访问层。可能我错了,我想知道。谢谢您的回答 。

6 个答案:

答案 0 :(得分:3)

简短的评论(没有解决方案)AFAIK是一个永恒的问题 - MVC只是一种模式,因此理论上 可以干净利落地实现。实际上,由于可用工具设置的限制(例如编程语言库内容和UI组件接口设计......),您必须做出本地决策。重要的是你瞄准分开这些......而不是一塌糊涂。我将我的评论暂停,然后留下来看看是否有人有“最终解决方案”。

答案 1 :(得分:1)

在MVC中,您应该将这些内容放在模型中(出于重用原因)。

但是,在HVMC中,您可以将它们放置在任何地方(例如在控制器中)并从应用程序中调用控制器。

答案 2 :(得分:1)

我会让你的控制器变得简单。

在许多方面,该模型允许您卸载许多复杂性,否则会遮挡您的控制器代码。这种复杂性的划分将使您的代码更容易理解,更易于维护。

我个人试着让我的模型类似于真实世界的对象,而不是数据库表或行。如果你用更易读的术语说话,它会更容易。单个真实世界对象可能涉及5个或6个数据库表...当你想要做的只是打开开关,或选择一朵花或油漆时,与5或6个模型说话会相当麻烦一个图标,或发送一条消息。

答案 3 :(得分:1)

对于简单的任务,我会写动作助手(例如sendNewsletter)。

对于复杂的任务,我会创建服务(例如,电子邮件,身份验证等)。

答案 4 :(得分:0)

使用多个型号的控制器出了什么问题? MVC的重点不在于使模型可重用吗?在您的第一个场景中,从“注册用户”控制器代码所在的位置发送电子邮件和操纵其他模型对象是完全正常的。

关于您的第二种情况,为什么不能SearchController使用ArticleModelImageModelVideoModel?没有模型的控制器没问题。 SearchController不需要SearchModel类,它只使用其他模型类。

我试图不在Web应用程序中对MVC大肆宣传,但基本上,恕我直言,控制器只是完成操作的高级步骤列表。作为一个粗略的例子,“注册用户”控制器代码应该在大致一行或两行代码中执行以下每个步骤:

  1. 验证输入
    1. 如果无效,请重新显示表单并显示错误
  2. 从表单输入
  3. 创建新的UserModel对象
  4. 将新的UserModel对象插入数据库
  5. 创建/编辑其他必要的模型对象
  6. 向新用户发送电子邮件
  7. 显示“注册成功”页面
  8. 这些步骤的编码方式在很大程度上取决于您使用的框架/架构。

答案 5 :(得分:0)

保持控制器清洁。对于后端处理,请使用经纪人类,如MailManager等。