代码之家  ›  专栏  ›  技术社区  ›  AlexA

表单处理代码需要抽象吗?(Zendèu表格)

  •  4
  • AlexA  · 技术社区  · 16 年前

    在Zend框架教程中,我可以看到表单处理代码,如

    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  
    

    但是代码仍然适用于不同的表单类型。

    我的问题是-我应该保持表单处理代码的重复性,还是编写一些ProcessSubmit()Zend\表单方法供所有子类使用? 我有过这样的经验,抽象并不总是好的,有时你最终会同步两个本该从一开始就不同的类。

    ZF的例子演示了重复的代码,所以我想知道这种重复性是合理的(至少对于小型3-4表单站点)还是需要通过各种方式来避免。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Stefan Gehrig    16 年前

    也许是一个 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
    }
    

    这可以扩展到您的需要,例如自动错误处理等。。。

        2
  •  1
  •   Noah Goodrich    16 年前

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

    虽然我在我的域层中没有使用Zend\u表单,但我注意到其他人会在他们的域模型中实现一个Zend\u表单实例,这样他们就可以在每个域模型的任何地方呈现一个一致的表单。就我个人而言,我觉得域对象与表示层的耦合太多了。

    相反,我使用Zend\u Filter\u输入作为域对象中验证的主干。

        3
  •  0
  •   Goran Jurić    16 年前

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