2009-11-18 48 views
4

在Zend的框架教程,我可以看到形式处理代码等表单处理代码是否需要抽象? (Zend_Form的)

if ($request->isPost()) { 
      $formData = $request->getPost(); 

      $code = $request->getParam("code"); 
      $url = $request->getParam("url"); 

      if ($form->isValid($formData)) { 
      // here goes code to determine insert/update action, 
      //retrive record data 
      //and perform relative database operation 

此代码为重复许多形式。我试图让表单处理更好,但不要过度设计它。到目前为止,我已经将这些代码从控制器移到Form对象中。 但是代码仍然针对不同的表单类型重复。

我的问题是这样的 - 我应该更喜欢保持表单处理代码重复或编写一些将由所有子类使用的ProcessSubmit()Zend_Form方法吗? 我有经验,抽象并不总是好的,有时你最终会同步两个与开始不同的类。

ZF示例演示重复的代码,所以我想知道这种重复性是否合理(至少对于3-4个小型网站)或者需要通过一切手段避免。

P.S.这个任务似乎很常见,我不知道我是否做了双重工作,并且已经有一个用于CRUD特定表单处理的ZF类。

+0

您不应将该代码移动到表单类。这显然是应用程序流程,因此它属于控制器。 代码重复是什么意思?如果您在表单的子类中指定了字段,则应通过调用'isValid()'自动进行验证。 – Franz 2009-11-18 12:32:19

+0

我的意图是将表单控件的处理移动到Form类中的是“瘦控制器/胖模型”的概念,例如, http://blueparabola.com/blog/fat-models-are-good。也许我的错误是将代码移动到Form中,而我应该将表单/记录处理移动到模型中。你怎么看待这件事? – AlexA 2009-11-18 15:53:27

回答

2

也许一个action helper可以,很好,帮助你在这里:

class App_Controller_Action_Helper_ProcessFormSubmit extends Zend_Controller_Action_Helper_Abstract 
{ 
    public function isValid(Zend_Form $form) 
    { 
     if ($this->getRequest()->isPost()) { 
      return $form->isValid($this->getRequest()->getPost()); 
     } else { 
      return false; 
     }   
    } 

    public function direct(Zend_Form $form) 
    { 
     return $this->isValid($form); 
    } 

} 

这可以让你处理表单提交的处理是这样的:

// or: if ($this->_helper->processFormSubmit->isValid($form)) { 
if ($this->_helper->processFormSubmit($form)) { 
    // here goes code to determine insert/update action, 
    //retrive record data 
    //and perform relative database operation 
} 

这可以扩展您的需求,例如自动错误处理等...

1

我实际上做的是将验证移动到域对象(或模型图层),然后我的域图层实现save()方法。

虽然我没有在我的领域层中使用Zend_Form,但我注意到其他人会在他们的领域模型中实现一个Zend_Form实例,以便他们可以为每个领域模型提供一致的表单。就我个人而言,我觉得这会将域对象耦合到表示层太多。

相反,我使用Zend_Filter_Input作为我的域对象验证的主干。

0

如果您想在验证表单之后使用“薄控制器/胖模型”,只需将整个表单或表单值传递给模型。

至于控制器中的控制结构,它们是“正常的”。

相关问题