Php MVC框架中如何使用表单?

Php MVC框架中如何使用表单?,php,model-view-controller,forms,Php,Model View Controller,Forms,我做简单的MVC教程已经有一段时间了,我明白了这个概念。但我想知道,当表单显示在视图中时,表单是如何处理的?用于检查表单提交的代码必须存在于视图文件中,因为视图应该只用于显示输出,所以视图文件并不适合 因此,当您在MVC框架的视图文件中有表单时,检查表单提交的代码应该在哪里?当然这取决于特定的框架,但这是非常典型的: 表单数据发布到控制器(与所有请求一样) 数据验证规则在模型中定义 控制器通过模型运行数据以进行验证 如果成功验证,控制器将执行其应执行的任何操作 如果数据无效,控制器将无效字段的

我做简单的MVC教程已经有一段时间了,我明白了这个概念。但我想知道,当表单显示在视图中时,表单是如何处理的?用于检查表单提交的代码必须存在于视图文件中,因为视图应该只用于显示输出,所以视图文件并不适合


因此,当您在MVC框架的视图文件中有表单时,检查表单提交的代码应该在哪里?

当然这取决于特定的框架,但这是非常典型的:

  • 表单数据发布到控制器(与所有请求一样)
  • 数据验证规则在模型中定义
  • 控制器通过模型运行数据以进行验证
  • 如果成功验证,控制器将执行其应执行的任何操作
  • 如果数据无效,控制器将无效字段的错误消息推送到视图
  • 该视图仅显示错误消息

我认为最常见的方法是控制器,因为控制器处理所有输入数据(通过$\u POST,$\u GET等),然后最终决定调用哪些方法来处理该输入,以及输出哪个视图。

检查和验证表单提交的代码应该在控制器或模型中,这取决于从表单接收的数据类型以及您对其所做的操作。这就是MVC的要点。视图文件应仅包含显示页面所需的最少量逻辑。

表单提交可以在controller中处理。检查

我以为模型只是为了获取/提交数据,不是吗?也就是说,控制器将校准模型以查询数据库,然后处理数据?这在使用MVC的开发人员中是一个非常常见的观点,尤其是在PHP中。在使用MVC时,很容易忘记良好的OOP原则,只是将代码“塞进”控制器中,因为它定义了一个网站“动作”。然而,控制器应该只是模型和视图之间的“中间人”;请求传入,控制器将数据提供给模型,模型返回所需的输出数据,控制器将输出数据提供给视图,视图显示它。搜索“瘦控制器胖模型”以查找更多关于此的讨论。但我想问的是,您在哪里检查表单提交?例如,检查是否按下提交按钮的实际代码(IF语句)。我想这一定是在视图中。@lyrae:为什么一定是视图?请记住,在MVC中,要加载的第一个文件将是控制器。在您的情况下,控制器可能会检查表单提交以告诉它要加载哪个模型,或者控制器可能只是基于URI加载模型,然后模型会检查表单提交。根据表单数据验证的结果,C或M可能决定再次加载表单视图,或加载其他视图。它们可能在不同的视图文件.Coles中,也可能不在其中,因为您需要一个IF语句来检查表单是否已提交。如果在控制器或模型中,它将在方法中。那么,这种方法将如何被调用呢?@lyrae:为什么在一个方法中不能有一个
if
语句?如果盲目地加载视图而不检查是否需要,那不是MVC,那只是一个模板。另外,请注意,MVC不一定需要OOP.Agreed。但是将表单数据传递给控制器的代码在视图中,不是吗?不是-视图只是编写HTML。PHP引擎将处理获取表单数据并将其存储在$\u GET/$\u POST中(取决于表单的method属性),然后由框架决定如何处理。通常,框架会将这些数据包装在某种请求对象中(这通常发生在调用控制器代码之前)。您可以按如下方式检查控制器中的表单数据:
if(isset($\u POST['myFormField']){/*表单数据已发布*/}
Yes。这就是我要说的。但是,您上面提供的代码片段将在控制器的方法中,对吗?这正是我的问题。我在想IF语句应该放在视图中(它不应该放在视图中,因为我知道视图只是为了输出,所以这个问题就被问到了)。所以现在的问题是,如果代码在控制器内的一个方法中,那么是什么调用该方法来检查表单提交?@lyrae每个请求都会在框架内经历一个周期,通常是路由器/调度器→ 控制器→ (模型→ 控制器)→ 看法(例如,请参阅)无论何时“打开”页面或发布表单数据,都是一个新请求。每个请求都经过相同的MVC周期。我建议您开始使用一个实际的MVC框架来感受它。