2012-06-29 93 views
2

好的,所以我來自Flex/ActionScript背景,因爲這個領域正在慢慢地枯竭,我想它是時候轉移到全職PHP。
無論如何,我認爲我對Zend框架有很好的理解(大部分地方使用它)。但是,他們大多隻用於表抽象類,所以它不是一個好的MVC實踐,更像是Model。
接受採訪我幾乎總是被問到表單驗證發生在哪裏。
現在我知道zend已經建立了驗證器,我不是在談論這個。
我正在討論在視圖中構建的標準HTML表單並將其提交給服務器。

我想知道的問題是,在控制中還是在模型中做得更好?

而且爲什麼要使用zend_form,對我來說,似乎設計師很難讓它變得性感。哪裏是放置表單驗證的最佳地點

回答

1

如果要連接的驗證器,以在所述控制器中的形式進行驗證,並且可以使用簡單的,如果()循環來檢查元件:

if($form->isValid($postData)) { 
    //do some stuff 
} 

否則可以驗證一個簡單的HTML表格或其他輸入在使用Zend_Filter_Input控制器:

//set filters and validators for Zend_Filter_Input 
    $filters = array(
     'id' => array('HtmlEntities', 'StripTags') 
    ); 

    $validators = array(
     'id' => array('NotEmpty', 'Int') 
    ); 

    //assign Input 
    $input = new Zend_Filter_Input($filters, $validators); 
    $input->setData($this->getRequest()->getParams()); 
if ($input->isValid()) { 
//do some stuff 
} 

你想做的事,至少基本的驗證和過濾控制器,試圖防止跨站腳本和SQL注入兩種方式。
如果需要,您可以隨時在域模型中進行更深入的驗證和過濾。

至於爲什麼使用Zend_Form,它沒有它最先出現的那麼糟糕。使用自定義消息附加驗證器和過濾器的能力對於某些人非常有用。開始時困難的裝飾者可以很好地利用和練習。你也欺騙,只是使用viewScript() decorator(就像我平時所做的那樣)。 viewScript裝飾器以更熟悉的形式提供了很多控制。

下面是一個例子:

//The Form 
class Application_Form_Search extends Zend_Form 
{ 
    public function init() { 
     $this->setMethod('POST'); 
     $this->setDecorators(array(
      array('ViewScript', array(
        'viewScript' => '_searchForm.phtml'//the partial script used as a decorator 
      )) 
     )); 
     // create new element 
     $query = $this->createElement('text', 'query'); 
     // element options 
     $query->setLabel('Search Keywords'); 
     $query->setAttribs(array('placeholder' => 'Artist or Title', 
      'size' => 27, 
     )); 
     // add the element to the form 
     $this->addElement($query); 

     $submit = $this->createElement('submit', 'search'); 
     $submit->setLabel('Search Site'); 
     $submit->setDecorators(array('ViewHelper')); 
     $this->addElement($submit); 
    } 
} 

partial腳本:

<article class="search"> 
    <form action="<?php echo $this->element->getAction() ?>" 
      method="<?php echo $this->element->getMethod() ?>"> 
     <table> 
      <tr> 
       <th><?php echo $this->element->query->renderLabel() ?></th> 
      </tr> 
      <tr> 
       <td><?php echo $this->element->query->renderViewHelper() ?></td> 
      </tr> 
      <tr> 
       <td><?php echo $this->element->search ?></td> 
      </tr> 
     </table> 
    </form> 
</article> 

,你可以看到這將是很大的代碼更熟悉和設計師的風格更加容易。

希望這會有所幫助,祝你好運......

+0

我只想補充一點,Zend_Form對於TDD是有好處的...... – tasmaniski

0

驗證的是模型的一部分,因爲它知道有關驗證某個實體的商業邏輯,但內部的控制器使用。

Zend_Form帶有像ViewScript這樣的裝飾器,它使得desinger使它變得性感,並使開發人員驗證,過濾,填充表單輸入變得輕而易舉。

相關問題