2011-02-24 53 views
1

我有一個領域模型和一個表單,我總是發現將一個地圖映射到另一個表面是非常棘手的。我從不喜歡將一個映射器的實例傳遞給一個表單。將領域模型映射到Zend表單

是否有意義創建一個使用域模型映射器來設置窗體默認值的窗體映射器?或者我應該在接受設置默認設置的DomainModel的表單上創建一個方法?

選項1的缺點是FormMapper對DomainModelMapper具有依賴性,選項2的缺點是控制器變得更胖。

class DomainModel 
{ 
    function toArray() {} 
} 

class DomainModelMapper 
{ 
    function findById($id) 
    { 
     return new DomainModel($id); 
    } 
} 

FormMapper使用DomainModelMapper來填充MyForm。

class MyForm extends Zend_Form 
{ 

} 

class FormMapper 
{ 
    function getFormById($id) 
    { 
     $mapper = new DomainModelMapper(); 
     $domainModel = $mapper->findById($id); 

     $form = new MyForm(); 
     $form->setDefaults($domainModel->toArray()); 

     return $form; 
    } 
} 
+0

你是什麼意思的映射即什麼是形式和領域模型之間的關係,是領域模型的一個實例'zend_db_table_abstract' – 2011-02-24 13:43:29

+0

DomainModel獨立於數據庫對象http://martinfowler.com/eaaCatalog/dataMapper.html ,我已經省略了數據庫層爲簡單 – gawpertron 2011-02-24 13:45:32

+0

@gawperton檢查我的更新的答案 – 2011-02-24 13:50:35

回答

1

你爲什麼不嘗試在你的控制器文件上這樣做。畢竟,你要顯示的形式

public function someAction() 
{ 

    $mapper = new DomainModelMapper(); 
    $domainModel = $mapper->findById($id); 

    $form = new MyForm(); 
    $form->populate($domainModel->toArray()); 
    $this->view->form = $form; 
} 

我認爲你可以做到這一點對你view.phtml文件還。

我不太清楚你的要求。但是我在zf上做的是這樣的,而且很容易和棘手。

  1. 名稱根據數據庫表字段一樣,如果我有一個領域f1, f2, f3, ..表中的所有表單域,然後我的表單元素名稱是f1, f2, f3, ..

  2. 所以,當我通過Db_Model檢索數據形式的數據庫,然後我填充使用$form->populate($dbmodel->toArray())同時編輯。

  3. 插入或更新時,我得到數組表單窗體。 first remove all non-db fields like submit buttom然後then $data = $form->getValues()$dbmodel->udpate($data, 'where condition')

我不知道在所有如果我解決你的問題,但讓我不使用任何數據庫映射器(至少與Zend肯定使更容易一些討厭的障礙,再用我的工作很多Zend公司)。

+0

是的,這是選項2.我可能已經過分簡化了這個例子,在現實中設置默認值將需要一點點調整。 – gawpertron 2011-02-24 13:54:23

+0

@gapertron當然可以對控制器文件進行調整 – 2011-02-24 13:58:41

+0

如果您需要在其他情況下重新使用該表單,則最終會重複調整。此外,您的數據庫字段名稱可能並不總是匹配您的域模型屬性。 – gawpertron 2011-02-24 14:18:59

相關問題