在Zend MVC中使用Zend_Form的更好方法

时间:2009-07-03 13:40:59

标签: php zend-framework zend-form

使用Zend_Form时,我发现自己创建了许多看起来像这样的控制器方法:

function editPersonAction()
{
   $model = $this->getPersonModel();
   $form = $this->getPersonEditForm();
   if ($this->getRequest()->isPost() {
       $data = $this->getRequest()->getPost();
       //$form->populate($data); [removed in edit]

       if ($form->isValid($data)) {
           $data = $form->getValues();
           $model->setFromArray($data);
           // code to save model then decide which page to redirect to
       }
   } else {
       $form->populate($model->toArray());
   }
   $this->view->form = $form;
}

大多数代码总是一样的,我相信有更好的方法可以做到这一点。人们使用Zend_Form还有哪些其他模式来减少使用的样板代码量?

3 个答案:

答案 0 :(得分:4)

我希望尽可能多地保留模型

function editPersonAction()
{
   $model = $this->getPersonModel();

   if ($this->getRequest()->isPost() {
       $data = $this->getRequest()->getPost();

       if ($model->validateForm($data)) {
           // code to save model then decide which page to redirect to
       } else {
          // error management
       } 
   } 

   $this->view->form = $model->getForm();
}

那么在模型中我会:

public function validateForm(array $data)
{    
    $form = $this->getForm();

    if($form->isValid($data))
    {
        // code to save model state

        return true;
    } else {
        return false;
    }
}

public function getForm($instance = 'default') {
   if (!isset($this->_forms[$instance])) {
       $this->_forms[$instance] = new Your_Form_Class();           
       $this->_forms[$instance]->populate($this->toArray());
   }

   return $this->_forms[$instance];
}

另外,您可以将此方法添加到所有应用程序模型将扩展的抽象模型中,然后仅在需要执行特殊操作时覆盖它们。

答案 1 :(得分:0)

$ form-> populate()真的有必要吗? IIRC无效表格将自动填充。

答案 2 :(得分:0)

老实说,我的控制器中也有类似的动作。我做的一件事就是在控制器中按照惯例保持重量,就是在模型中进行验证检查。我也从模型中调用表单对象来促进这一点(您可能已经通过控制器中的getPersonEditForm方法执行此操作。因此,如果我编写了您的操作,它将如下所示:

function editPersonAction()
{
   $model = $this->getPersonModel();
   $form  = $this->getPersonEditForm();

   if($this->getRequest()->isPost()) 
   {
       if($model->setFromArray($this->getRequest()->getPost()))
       {
           // code to decide which page to redirect to
       }
   }
   else
   {
       $form->populate($model->toArray());
   }

   $this->view->form = $form;
}

那么在模型方法setFromArray中我会:

public function setFromArray(array $data)
{
    $form = $this->getRegistrationForm();

    if($form->isValid($data))
    {
        // code to save model state

        return true;
    }
    else
    {
        return false;
    }
}

不可否认,它并不比你现有的方法简洁得多,我和你一样,经常觉得这可以更好地抽象。