表单处理逻辑在哪里属于MVC Web应用程序?

时间:2008-12-05 19:46:10

标签: model-view-controller forms webforms

在使用模型 - 视图 - 控制器设计模式的基于Web的应用程序中,与处理表单提交相关的逻辑似乎属于模型层和控制器层之间的某处。在复杂形式的情况下尤其如此(即表单处理远远超出简单的CRUD操作)。

概念化这个的最佳方法是什么?表格只是模型和控制器之间的一种粘合剂吗?或者形式逻辑是否完全属于M或C阵营?

编辑:我理解MVC应用程序中的基本信息流(请参阅chills42的摘要答案)。我的问题是表单处理逻辑属于哪里 - 在控制器,模型或其他地方?

4 个答案:

答案 0 :(得分:4)

我认为这可能被视为两个单独的行动......

  1. 提交表格(V - > C)
  2. 处理提交(C - > M)
  3. 在泛型中,我倾向于将每个动作视为各部分之间的消息。完整系列的消息将是这样的......

    • 显示表格(C - > V)
    • 由用户提交(V - > C)
    • 处理内容(C→M)
    • 处理完成(M - > C)
    • 显示结果(C - > V)

答案 1 :(得分:3)

同意chills42,但会尽可能多地添加到模型中 当用户提交(V-> C)时,它将被提交给某个控制器,并且我认为最好是控制器只是作为调度员来决定接下来会发生什么,可能是基于一些简单的数据点。让模型有一个方法(通常不是严格的ORM或基于活动记录)处理原始数据并在适当的情况下将其保存到数据库中,然后简单地返回状态或抛出错误。

答案 2 :(得分:3)

虽然起初使用V的想法 - > C,C - > M,M - > C看起来很好,对表单的任何更改都需要弄乱控制器+模型+视图。应该避免这样做以保持应用程序逻辑简单。这是一个非常简单的框架扩展,通过将表单处理逻辑委托给一个单独的类并保持MVC架构来处理应用程序逻辑,使得处理Web表单处理变得非常容易。

对于您需要处理的每个表单,创建一个派生自通用“webform”类或codeigniter模型类的类。将validate(),process(),display()等方法添加到此类中。

在控制器中,代码变成这样。

class User_controller
{

    function login()
    {
        $form = new LoginForm(); // this is the class you would create
        if ($form->validate())
        {
            $data = $this->user_model->getUserData( $form->userid );
            // form processing complete, use the main "user" model to fetch userdata for display,
            // or redirect user to another page, update your session, anything you like
        } else {
            $form->display();
        }
    }
}

表单类中的display方法加载自己的视图,并根据需要填充回发数据。通过使用上述内容,几乎没有什么优势:

  • 如果表单显示或处理需要更改,则无需更改主控制器。

  • 您无需更改用户模型

  • 控制器保持清洁并处理主页面逻辑

  • 用户模型仍然清除,只与数据库交互

框架本身可以更新,以便可以使用

加载webforms

$这 - >负载>形式( “登录”); ......

但是,这只是对codeigniter团队有用的建议。

答案 3 :(得分:1)

表单处理应该在模型中进行,因为这是通过视图方式从控制器接收和处理数据的应用程序层。控制器移动它,但是对于实际的代码执行,它应该在你的模型中发生。