我有一个域模型和一个表单,我总是发现将一个映射到另一个很棘手。我从来都不喜欢将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;
}
}
答案 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中所做的就是这样,非常容易和棘手。
根据数据库表字段命名所有表单字段,如果我的表格包含字段f1, f2, f3, ..
,那么我的表单元素名称为f1, f2, f3, ..
因此,当我通过Db_Model
检索数据表单数据库时,我会在编辑时使用$form->populate($dbmodel->toArray())
填充。
插入或更新时,我会获得数组表单。 first remove all non-db fields like submit buttom
然后then $data = $form->getValues()
和$dbmodel->udpate($data, 'where condition')
我不确定我是否解决了你的问题,但Zend确实让我的工作变得更容易,只有几个令人讨厌的怪物障碍,所以我不使用任何数据库映射器(至少用zend)。