使用Zend_Form时,我发现自己创建了许多看起来像这样的控制器方法:
function editPersonAction()
{
$model = $this->getPersonModel();
$form = $this->getPersonEditForm();
if ($this->getRequest()->isPost() {
$data = $this->getRequest()->getPost();
//$form->populate($data); [removed in edit]
if ($form->isValid($data)) {
$data = $form->getValues();
$model->setFromArray($data);
// code to save model then decide which page to redirect to
}
} else {
$form->populate($model->toArray());
}
$this->view->form = $form;
}
大多数代码总是一样的,我相信有更好的方法可以做到这一点。人们使用Zend_Form还有哪些其他模式来减少使用的样板代码量?
答案 0 :(得分:4)
我希望尽可能多地保留模型
function editPersonAction()
{
$model = $this->getPersonModel();
if ($this->getRequest()->isPost() {
$data = $this->getRequest()->getPost();
if ($model->validateForm($data)) {
// code to save model then decide which page to redirect to
} else {
// error management
}
}
$this->view->form = $model->getForm();
}
那么在模型中我会:
public function validateForm(array $data)
{
$form = $this->getForm();
if($form->isValid($data))
{
// code to save model state
return true;
} else {
return false;
}
}
public function getForm($instance = 'default') {
if (!isset($this->_forms[$instance])) {
$this->_forms[$instance] = new Your_Form_Class();
$this->_forms[$instance]->populate($this->toArray());
}
return $this->_forms[$instance];
}
另外,您可以将此方法添加到所有应用程序模型将扩展的抽象模型中,然后仅在需要执行特殊操作时覆盖它们。
答案 1 :(得分:0)
$ form-> populate()真的有必要吗? IIRC无效表格将自动填充。
答案 2 :(得分:0)
老实说,我的控制器中也有类似的动作。我做的一件事就是在控制器中按照惯例保持重量,就是在模型中进行验证检查。我也从模型中调用表单对象来促进这一点(您可能已经通过控制器中的getPersonEditForm
方法执行此操作。因此,如果我编写了您的操作,它将如下所示:
function editPersonAction()
{
$model = $this->getPersonModel();
$form = $this->getPersonEditForm();
if($this->getRequest()->isPost())
{
if($model->setFromArray($this->getRequest()->getPost()))
{
// code to decide which page to redirect to
}
}
else
{
$form->populate($model->toArray());
}
$this->view->form = $form;
}
那么在模型方法setFromArray
中我会:
public function setFromArray(array $data)
{
$form = $this->getRegistrationForm();
if($form->isValid($data))
{
// code to save model state
return true;
}
else
{
return false;
}
}
不可否认,它并不比你现有的方法简洁得多,我和你一样,经常觉得这可以更好地抽象。