2009-07-03 6 views
3

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で他にどのようなパターンを使用していますか?

答えて

0

$ form-> populate()は本当に必要ですか?無効なIIRCフォームは自動的に入力されます。

+0

私は最初の$ form-> populate()を削除しました。 2つ目は、最初にデータベースからフォームを初期設定する必要があります。 –

0

正直言って、コントローラにも同様の見た目のアクションがあります。コントローラーとコンベンションで体重を抑えるために行うことの1つは、モデルの検証チェックを行うことです。私は(すでにあなたのコントローラでのご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; 
    } 
} 

確かに、それはかなり簡潔な既存のアプローチよりもありませんし、私は、自分自身のように、多くの場合、これは、より良い抽象化されたかもしれないと感じ

+0

私は、setFromArrayが少なくとも私の観点からは適切な定義ではないように、モデルのメソッド名を似ていると思います。 –

+0

setFromArrayは良いメソッド名のようには聞こえませんが、データに何が起きているのかを記述します(最初に検証する必要があります)。私のモデルメソッドの大部分は、 'get'、 'add'、 'edit'、または 'delete'で始まるので、データの処理内容を明確に示します。 –

4

を私は維持したいです。 posと同じくらいモデルでsible

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]; 
} 

をプラスあなたはすべてのアプリケーションモデルが延長する抽象モデルには、このメソッドを追加し、その後にのみ上書きすることができますあなたが何か特別なことをする必要があるときにそれらを。

+0

フォームオブジェクトを配列として格納することは洞察になります。これは、私が現在特定のフォームのゲッターを持っているので、私のモデルでできることです。 +1 –

関連する問題