在使用模型 - 视图 - 控制器设计模式的基于Web的应用程序中,与处理表单提交相关的逻辑似乎属于模型层和控制器层之间的某处。在复杂形式的情况下尤其如此(即表单处理远远超出简单的CRUD操作)。
概念化这个的最佳方法是什么?表格只是模型和控制器之间的一种粘合剂吗?或者形式逻辑是否完全属于M或C阵营?
编辑:我理解MVC应用程序中的基本信息流(请参阅chills42的摘要答案)。我的问题是表单处理逻辑属于哪里 - 在控制器,模型或其他地方?
答案 0 :(得分:4)
我认为这可能被视为两个单独的行动......
在泛型中,我倾向于将每个动作视为各部分之间的消息。完整系列的消息将是这样的......
答案 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)
表单处理应该在模型中进行,因为这是通过视图方式从控制器接收和处理数据的应用程序层。控制器移动它,但是对于实际的代码执行,它应该在你的模型中发生。