2010-05-07 86 views
5

我的问题是在模型和controller.Everything介于两者之间完美的作品对我来说,当我使用MVC只为CRUD(创建,读取,更新,删除)。我对每个数据库不同的模型表格。我从控制器访问这些模型,以克服它们。例如,在联系人应用程序中,我在控制器(联系人)中使用模型(联系人)方法(创建,读取,更新,删除)执行操作(创建,读取,更新,删除)。哪些代码应该去哪里在MVC结构

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

  1. 例如,在注册的用户进程。我不能在用户模型中完成这个过程,因为我也必须使用其他模型(发送邮件,通过其他模型为用户创建其他记录),并通过其他模型进行大量复杂的验证。例如,在一些复杂的搜索过程中,我必须访问很多模型(文章,视频,图像等)。
  2. 或者,有时候,我必须使用apis来决定接下来要做什么或者哪个数据库模型我会用来记录数据

那么,哪里是做这个复杂的过程的地方。我不想在控制器中执行它们,因为有时候我也应该在其他控制器中使用这些进程。我不想将这些过程放入模型中,因为我使用模型作为数据库访问层。可能是我错了,我想知道。谢谢您的回答 。

+1

+1感谢您问... – 2010-05-07 04:50:34

回答

1

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

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

+0

谢谢你的回答,我认为你的回答就像我的想法,我的意思是我也这么认为,你可以给任何资源来指导我这种编写代码或创建mvc结构的方式。 – 2010-05-07 08:44:12

+0

如果您喜欢本书,请阅读“Zend Framework 1.8 Web应用程序开发”。对于在线资源,请去谷歌搜索'zend framework action helpers'并查看http://www.slideshare.net/weierophinney/playdoh-modelling-your-objects-1766001(着名的短语:应用程序就像洋葱;) – takeshin 2010-05-07 16:06:10

3

只是一个简短的评论(没有解决方案)AFAIK是一个永恒的问题 - MVC只是一个模式,因此,理论上干净地实施。实际上,由于可用工具(例如编程语言库内容和UI组件界面设计)设置的限制,您必须作出本地决策。重要的是你目标分开这些...并没有在一个烂摊子里的一切。我将我的评论停播,并留下来看看是否有人有“最终解决方案”。

+0

我主要同意这个... – alex 2010-05-07 06:55:03

+0

这是一个很好的泛化,因为它是真正的参考真实时间经验变量 - 考虑到我在问题海报中的位置令人沮丧。我将不得不涂抹MVC执行清洁因子以达到我的目标。 – HomeOffice 2016-07-15 11:52:08

1

在MVC中,你应该把这些东西放在模型中(为了重用的原因)。

然而,在HVMC,你可以把他们的地方(如控制器),并从应用程序中调用控制器。

+1

在另一个模型中使用模型怎么样?我可以从另一个模型中调用任何模型吗?谢谢 – 2010-05-07 04:29:06

+0

对于Oguz和@ alex,控制器的同样问题? – 2010-05-07 04:52:48

+0

是的你可以,我经常在另一个模型中做'if($ this-> userModel-> loggedIn()){}' – alex 2010-05-07 04:52:51

1

我会让你的控制器简单。

在许多方面,该模型可以让你卸载了很多,否则将堵塞你的控制器代码的复杂性。它的复杂性分工将使您的代码更易于理解,并且更易于维护。

个人我试图保持我的模型类似真实世界的对象,而不是数据库表或行。如果你用可读性更强的话来说,它会更容易。一个真实世界的对象可能涉及5个或6个数据库表......而当用5或6个模型说话时,要想做的只是打开开关,选择一朵花或绘画,这将是一个相当大的麻烦一个图标或发送消息。

+0

@Bingy你可以参考任何教程,可以指导我的方式,你类似于你的MVC?即使我喜欢类似的东西,以现实世界...请建议 – 2010-05-07 04:56:49

+0

不脱离我的头顶... 它的东西,将与实践有意义。一旦你做了一次或两次,你会有一个更好的主意。不要害怕去一趟。当你回来几天或一周后,你会充满想法,如何能够做得更好。 你想避免的是将自己涂在角落里。例如,会话数据分布在控制器/模型/和其他处理程序中。 由于您为每个表格创建了许多模型,因此您可以从拥有引用许多较小型号的“超级模型”中受益。 – Bingy 2010-05-07 05:29:34

0

使用多个模型的控制器出现了什么问题?MVC的重点不是让模型可重用吗?在第一种情况下,从“注册用户”控制器代码所在的位置发送电子邮件并操纵其他模型对象是完全正确的。

关于你的第二个方案,为什么不能SearchController使用ArticleModelImageModelVideoModel?拥有没有模型的控制器是很好的。 SearchController不需要SearchModel类,它只是使用其他模型类。

我试图不进入关于在web应用程序的MVC的咆哮,但基本上,恕我直言,控制器只是一个高级别的步骤完成操作的列表。作为粗略示例中,“注册用户”控制器代码应该做的每个执行以下步骤的大致一或两行的代码:

  1. 验证输入
    1. 如果不是有效的,重新显示与表单错误
  2. 从表单输入
  3. 将新UserModel对象插入到数据库中创建新的对象UserModel
  4. 创建/编辑任何其他模型对象是必要的
  5. 发送了一封电子邮件给新用户
  6. 显示“注册成功”的页面

如何将这些步骤被编码在很大程度上依赖于任何框架/架构你”重新使用。

+0

有为什么我不能使用控制器来验证数据或执行其他复杂的过程有很多原因。例如,有时我必须从另一个控制器重复这个方法,所以我不应该在另一个控制器中写这个代码。此外,Controller不知道所需的验证规则模型,它只提供数据,模型验证此数据。我不是理解为什么您不必验证控制器中的数据的最佳人选,但我相信您必须在控制器中不这样做。 – 2010-05-07 08:42:19

+0

模型类是否包含验证函数并不重要。控制器只需要一个真/假来指示输入是否有效。 – 2010-05-07 08:49:26

0

保持控制器清洁。对于后端处理使用像MailManager等经理类。