Zend_Form 可以在不同的点查看。它根本不能被视为 MVC 模式的一层的一部分。
首先 Zend_Form 使用装饰器和视图助手来渲染表单,此时它是视图层的一部分。
然后,Zend_Form 执行部分模型作业过滤和验证内容。
我们知道控制器层渲染来自视图的输入并将其传递给模型。实际上,控制器层决定从模型层加载哪些资源,然后执行正确的调用。
当您从控制器层调用 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;
}
}
从标准目录结构中我们可以看到 Forms 不在模型文件夹中,也不在视图文件夹中,因为 Zend_Form 是一个将许多资源和层绑定在一起的特定类。如果您查看 Matthews 帖子,您会发现这正是在视图脚本上设置操作 url 并且将表单绑定到模型时所说的内容。
最后,您可以分析您的上下文并选择这两种方法之一。
目前,我的选择是将表单与模型联系起来。看起来不错!对我来说很有意义。