【问题标题】:How are forms used in an MVC framework?MVC 框架中如何使用表单?
【发布时间】:2011-05-16 08:56:46
【问题描述】:

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

那么当你在 MVC 框架的视图文件中有一个表单时,检查表单提交的代码应该在哪里呢?

【问题讨论】:

    标签: php model-view-controller forms


    【解决方案1】:

    当然这取决于具体的框架,但这是比较典型的:

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

    【讨论】:

    • 我以为模型只是为了获取/提交数据,不是吗?即,控制器会调用模型来查询数据库,然后处理数据。 ?
    • 这是在使用 MVC 的开发人员中相当普遍的观点——尤其是在 PHP 中。使用 MVC 时很容易忘记良好的 OOP 原则,只需将代码“填充”到控制器中,因为它定义了网站“动作”。然而,控制器应该只是模型和视图之间的“中间人”;请求进来,控制器将数据提供给模型,模型返回所需的输出数据,控制器将输出数据提供给视图,视图显示它。搜索“瘦控制器胖模型”以找到更多关于此的讨论。
    【解决方案2】:

    可以在控制器中处理表单提交。检查this

    【讨论】:

      【解决方案3】:

      检查和验证表单提交的代码应位于控制器或模型中,具体取决于从表单接收到的数据类型以及您正在使用它做什么。这就是 MVC 的意义所在。视图文件应仅包含显示页面所需的最少量逻辑。

      【讨论】:

      • 但我要问的是,你在哪里检查表单提交?比如,检查提交按钮是否被按下的实际代码(IF 语句)。我假设这个 - 必须 - 在视图中。
      • @lyrae:为什么必须是视图?请记住,在 MVC 中,要加载的第一个文件将是控制器。在您的情况下,控制器可能会检查表单提交以告诉它要加载哪个模型,或者控制器可能只是根据 URI 加载模型,然后模型检查表单提交。根据表单数据验证的结果,C 或 M 可能决定再次加载表单 View,或者加载不同的 View。这些可能在也可能不在不同的视图文件中。
      • Coles - 因为您需要一个 IF 语句来检查表单是否已提交。如果在 Controller 或 Model 内部,它将在方法内部。那么如何调用这种方法呢?
      • @lyrae:为什么不能在方法中包含if 语句?如果视图被盲目加载而没有检查是否需要,那就是不是 MVC,那只是一个模板。另外请注意,MVC 不一定需要 OOP。
      【解决方案4】:

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

      【讨论】:

      • 同意。但是将表单数据传递给 Controller 的代码,在 View 中,不是吗?
      • 否 - 视图只是编写 HTML。 PHP 引擎将处理获取表单数据并将其存储在 $_GET/$_POST 中(取决于表单的方法属性),然后由框架决定如何处理它。通常,框架会将这些数据包装在某种请求对象中(这通常发生在调用控制器代码之前)。您可以按如下方式检查控制器中的表单数据:if (isset($_POST['myFormField'])) { /* form data has been posted */ }
      • 是的。这就是我要说的。但是,您上面提供的代码的 sn-p 将在控制器的方法中,对吗?这正是我的问题。我在想 IF 语句会出现在视图中(它不应该出现,因为我知道视图只是为了输出 - 因此这个问题是在 SO 上提出的)。那么现在的问题是,如果该代码在控制器内部的一个方法中,是什么调用该方法来检查表单提交?
      • @lyrae 每一个请求都会在你的框架中经历一个循环,通常是Router/Dispatcher → Controller → (Model → Controller) → View。 (例如,请参阅book.cakephp.org/view/898/A-Typical-CakePHP-Request)每当您“打开”页面或发布表单数据时,它都是一个新的请求。每个请求都经过相同的 MVC 循环。我建议您开始使用实际的 MVC 框架来感受它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多