2009-11-18 72 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

如果您想在驗證表單之後使用「薄控制器/胖模型」,只需將整個表單或表單值傳遞給模型。

至於控制器中的控制結構,它們是「正常的」。

相關問題