2010-10-21 75 views
8

Zend Framework主要用於MVC使用。其中一個非常有用的組件是Zend_FormZend_Form在哪裏適合模型視圖控制器範例

找到Zend_Form的位置有點麻煩。它是視圖,模型還是控制器的一部分,我應該承擔哪些責任。

事情是,Zend_Form做了兩件事:裝飾和渲染表單並驗證它。第一個是真正的視圖任務,第二個是真正的模型任務。

現在最常見的用法似乎是將表單與控制器進行交互,將兩個任務(渲染和驗證)有效地放到視圖/控制器中。

Matthew Weier O'Phinney給出的另一個選項是將窗體附加到您的模型,並在控制器中添加稍後的視圖選項。

所以,我很懷疑。在MVC模式中,我應該放置Zend_Form,我應該如何使用它?

編輯目前爲止的回答很好,謝謝!我會在獎勵到期前一兩個小時給予賞金,所以如果你有更多的想法,請給出答案!

回答

5

Zend_Form可以在不同的點查看。它完全不能被視爲MVC模式的一部分。

首先,Zend_Form使用裝飾器和視圖助手來渲染窗體,此時它是視圖層的一部分。 然後,Zend_Form完成模型作業的一部分過濾並驗證內容。

我們知道Controller層從視圖渲染輸入並將其傳遞給模型。實際上,控制器層決定從模型層加載哪個資源,然後執行更正呼叫。

當您從控制器層調用Zend_Form時,您可以考慮調用一個模型資源來執行取值和篩選操作,並決定這是否是有效的輸入。例如:

public function newAction() 
{ 
    $form = $this->getForm(); 

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

     if($form->isValid($formData)) 
     { 
      $Model = $this->getModel(); 
      $id = $Model->insert($form->getValues()); 
     } 
    } 

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

領帶形式的模型,因爲當你正在執行過濾和驗證操作你的模型層上被認爲是一個很好的實踐。因此,當馬修提出:

class Model_DbTable_Users extends Zend_Db_Table 
{ 
    protected $_name = 'users'; 
    protected $_form; 

    public function getForm() 
    { 
     if(!$this->_form) 
      $this->_form = new Form_User(); 
     return $this->_form; 
    } 

    public function add($data) 
    { 
     $form = $this->getForm(); 
     if(!$form->isValid($data)) return false; 

     if($form->getValue('id')) 
     { 
      $id = (int) $form->getValue('id'); 
      $this->update($form->getValues(), 'id =' . $id); 
     } 
     else 
     { 
      $id = $this->insert($form->getValues()); 
     } 
     return $id; 
    } 
} 

從標準的目錄結構,我們可以看到,表單是不是模型文件夾中,也沒有在視圖文件夾,因爲Zend_Form的是,配合大量資源,各層連接在一起的特定類。如果你檢查Matthews文章,你會意識到,這正是當在視圖腳本上設置動作URL並且表單與模型綁定時所說的內容。

最後,你可以分析你的上下文,並選擇這兩種方法之一。

目前,我的選擇是將表格與模型綁定。看起來不錯!並對我有很大的意義。

1

Zend_Form通常會覺得自己很奇怪。我認爲每個人的里程都不一樣。最近,我的大多數管理界面都非常拖拽AJAX-y,並且他們需要大量的html和javascript - 實際的表單元素很稀疏。所以我選擇了避開Zend_Form的許多特性,並將其用作過濾的幻想視圖助手。我所有的驗證都是在模型中的一個單獨的層上完成的。

我認爲O'Phinney的想法也很有意義。在這裏,他選擇將表單視爲域對象的組成部分 - 他可以在其中添加業務邏輯。這聽起來很好,只要你小心地保持表單的所有視圖邏輯分離。正如他所指出的那樣,這是關於語義的。不一定是硬性規定。

2

國際海事組織,Zend_Form旨在穿多個帽子。事實上,它是一個視角與模型之間的橋樑,並帶有來自控制器的巨大支撐梁。

不要將表單分配給模型,而應考慮將模型分配給表單。

在模型層中,可以有一個getFormInputs方法,該方法可以返回輸入數據所需的元素。該模型並不在乎將要使用它的形式,它只是讓任何人都可以使用它。

現在在表單圖層中,創建一個setupInputs方法,該方法將通過一系列模型循環以獲取所有輸入。如果只有一個模型,請將輸入添加到表單。如果有多個模型,則創建子表單。

您的控制器將啓動表單並將值傳遞迴模型(請參閱Keyne的newAction方法)