将域模型映射到Zend表单

时间:2011-02-24 13:34:52

标签: design-patterns zend-framework zend-form datamapper

我有一个域模型和一个表单,我总是发现将一个映射到另一个很棘手。我从来都不喜欢将mapper的实例传递给表单。

创建使用域模型映射器设置表单默认值的表单映射器是否有意义?或者我应该在接受设置默认值的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;
    }
}

1 个答案:

答案 0 :(得分: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')

  4. 我不确定我是否解决了你的问题,但Zend确实让我的工作变得更容易,只有几个令人讨厌的怪物障碍,所以我不使用任何数据库映射器(至少用zend)。