PHP表单处理 - 分布式还是集中式?

时间:2011-07-25 10:18:25

标签: php forms post

我已经四处寻找,但似乎没有就哪一个更好找出明确的共识。目前,站点上的所有HTML表单都指向一个PHP文件。每个表单都有一个隐藏的输入,用于指定操作(例如'user-login','user-logout'),以及PHP文件从中调用方法。

所以我的问题是:我应该将每个表单指向自身,将相关表单指向单个文件还是将所有表单指向单个文件?就MVC而言,是否应该在控制器或表单中进行处理?

6 个答案:

答案 0 :(得分:2)

  

我应该将每个表单指向自身,将相关表单指向单个文件还是将所有表单指向单个文件?

您应该将所有内容指向index.php,然后委托其他组件(MVC术语中的控制器)来处理。然后,控制器将决定要呈现的视图index.php在这种情况下我们称之为前端控制器。 ( note :下面我建议将ZF1作为一个学习平台.ZF1有一个“前端控制器”类。有些人可能会争辩说那是一个前控制器而index.php就是他们所说的输入脚本。在我看来,这只是第二个“前线”控制器。但是,这两种观点都存在争议,所以请提出自己的看法。

  

就MVC而言,是否应该在控制器或表单中进行处理?

首先是OOP:对象是唯一知道如何验证自己的数据的对象(自包含原则),因此表单应该验证自己。如果它是关于模型的,那么模型应该由控制器或表单调用 - 这是一个品味问题。无论采用哪种方式,同样的原则都适用:您向模型提供数据并调用验证方法。

您可能已经注意到,Form类是Model

不要让自己被称为MVC的炒作所迷惑。 首先尊重OOP原则

关于MVC:MVC模式说:控制器只协调其他组件,例如它接受输入,创建一个Form实例,并调用Form的验证方法。

我建议您使用框架来更好地了解所有这些部分如何协同工作。最好的是zend框架1,它与现实生活要求几乎没有关系,但这是模式和实践方面的杰作。

也许ZF2会用额外的前置控制器改变这个错误。


看看其他答案,我觉得有必要澄清我的答案中使用的一些术语:

  • Model是一个模型。有很多关于MVC的文档
  • FormModel的子类。它负责验证。它也可能有一个方法Form::__toString(),它在视图中呈现HTML表单(MVC中的V)
  • view 是html文件,它是在控制器(MVC中的C)的监督下呈现的

总结一下,整体执行流程如下所示:

  1. <form action ...
  2. 输入脚本(前端控制器)
  3. 路由器(它决定将请求转发给哪个Controller)
  4. Controller协调所有操作,调用一个或多个模型Model::validate()(包括Form,也是Model
  5. 最后,Controller选择render()一个视图(一个html文件),其中可能包含对Form::__toString()的调用,在这种情况下FormModel和“渲染器”的混合体。
  6. 趣味
  7. 利润
  8. 就是这样,基本上。不同的框架具有不同的数据/执行流程。例如,ZF1看起来像这样:http://www.slideshare.net/polleywong/zend-framework-dispatch-workflow

答案 1 :(得分:1)

在MVC术语中,您的处理应该在控制器中进行。您的表单(视图)中不应该有任何处理逻辑。您是否拥有每个表单的不同控制器。例如,您可以使用单个控制器接受所有表单提交并执行一些常见处理(例如csrf检测),然后为每个表单调用其他控制器。或者,您可以使用单个控制器从数据库加载验证要求,并根据提交的表单行为不同。

答案 2 :(得分:0)

在我看来,你应该为每个目的使用一个文件。与mvc结构相同,这是一种很好的编程方法,当代码变得非常复杂时,它会很有用。

答案 3 :(得分:0)

在MVC术语中,将所有表单指向单个脚本意味着您有一个前端控制器用于表单。有一个控制器处理表单请求。

  

我应该将每个表单指向自身,将相关表单指向单个文件还是将所有表单指向单个文件?

这取决于您的需求和设计甚至是您网站的架构。

  

就MVC而言,是否应该在控制器或表单中进行处理?

MVC中的处理通常发生在控制器内(仅轻微)和模型(重处理)。因此,如果您正在寻找示例性的MVC设计实现,那么您很可能会使用控制器使用的表单模型

这将确保您可以更灵活地使用表单,并且不会在应用程序中复制表单处理代码。

答案 4 :(得分:-1)

您的问题与Front Controller Pattern密切相关。在我看来,你不会因为指向一个特定的脚本而失去任何东西,但是赢得灵活性会执行某些操作而不必重复(并且可能在某些地方徘徊)这些操作。

所以我建议将所有表格都指向一个脚本。

顺便说一下。它是控制器根据Web MVC处理表单处理。

答案 5 :(得分:-1)

继续我对弗拉维乌斯回答的评论.....

封装表单的对象应该用于向用户呈现表单和检索从用户发回的数据。使用2个不同的代码集对同一数据集进行操作会破坏封装原则。考虑您的登录表单是否有名称和密码字段。如果您决定要处理密码的sha1哈希值而不是原始值,则可能需要在2个不同的位置修改2位代码!

这并不意味着表单对象的两个实例都需要在同一个URL路径中实现;考虑PHP的'require'和auto_include结构。

如果多个输入集通过相同的URL路径进行多路复用,则称为前端控制器模式。

Front Controller与更分散的方法相比有好处和问题。

前端控制器:

  • 允许常见处理仅在一个地方实施(例如授权,记录)
  • 将应用程序的结构从文件系统布局移到代码中,从而控制代码中实现的应用程序结构
  • 简化了书签的处理

非前置控制器:

  • 更容易支持
  • 来自网络服务器日志的应用程序结构
  • 更强大 - 因为破坏一个脚本deos不会破坏整个网站
  • 更好的性能 - 无需加载大量冗余代码/延迟加载处理目标