我已经四处寻找,但似乎没有就哪一个更好找出明确的共识。目前,站点上的所有HTML表单都指向一个PHP文件。每个表单都有一个隐藏的输入,用于指定操作(例如'user-login','user-logout'),以及PHP文件从中调用方法。
所以我的问题是:我应该将每个表单指向自身,将相关表单指向单个文件还是将所有表单指向单个文件?就MVC而言,是否应该在控制器或表单中进行处理?
答案 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的文档Form
是Model
的子类。它负责验证。它也可能有一个方法Form::__toString()
,它在视图中呈现HTML表单(MVC中的V)总结一下,整体执行流程如下所示:
<form action ...
Controller
协调所有操作,调用一个或多个模型Model::validate()
(包括Form
,也是Model
)Controller
选择render()
一个视图(一个html文件),其中可能包含对Form::__toString()
的调用,在这种情况下Form
是Model
和“渲染器”的混合体。就是这样,基本上。不同的框架具有不同的数据/执行流程。例如,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与更分散的方法相比有好处和问题。
前端控制器:
非前置控制器: