表单处理代码是否需要抽象? (Zend_Form的)

时间:2009-11-18 12:19:42

标签: php zend-framework refactoring

在Zend Frameworks教程中,我可以看到像

这样的表单处理代码
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  

此代码重复多种形式。我正在努力使表单处理更好,但不要过度设计它。到目前为止,我已将此代码从Controllers移动到Form对象中。 但代码仍然针对不同的表单类型。

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

ZF示例展示了重复的代码,因此我想知道这种双重性是否合理(至少对于3-4个小型网站而言)或者需要一定避免。

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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