Zend_Form在Model View Controller范例中的适用范围

Pet*_*mit 8 model-view-controller zend-framework zend-form

Zend框架主要意味着MVC使用.其中一个非常有用的组件是Zend_Form.

找到Zend_Form的地方我有点麻烦.它是视图,模型或控制器的一部分,我应该赋予它哪些责任.

问题是,Zend_Form做了两件事:装饰和渲染表单并验证它.第一个是真实的视图任务,第二个是真正的模型任务.

现在最常见的用途似乎是让表单只与控制器交互,有效地将两个任务(渲染和验证)放到视图/控制器上.

Matthew Weier O'Phinney给出的另一个选项是将表单附加到模型,并在控制器中添加后面的视图选项.

所以,我很怀疑.我应该在MVC模式中放置Zend_Form,我应该如何使用它?

编辑目前为止的好答案,谢谢!我将在它到期前一两个小时给予赏金,所以如果你有更多的想法,请给出答案!

Key*_*ana 5

Zend_Form可以在不同的点上查看.它根本不能被视为一层MVC模式的一部分.

首先,Zend_Form使用装饰器和视图助手来渲染表单,此时它是视图层的一部分.然后,Zend_Form执行模型作业过滤和验证内容的一部分.

我们知道Controller层从视图中呈现输入并将其传递给模型.实际上,控制器层决定从模型层加载哪个资源,然后执行更正调用.

当您从控制器层调用Zend_Form时,您可以考虑调用一个模型资源来执行valitation和过滤操作,并确定这是否是有效输入.例如:

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;
}
Run Code Online (Sandbox Code Playgroud)

将表单绑定到模型可以被认为是一个很好的实践,因为当您执行过滤和验证操作时,您处于模型层.所以,正如马修提出的那样:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

从标准目录结构中我们可以看到Forms不在模型文件夹中,也不在视图文件夹中,因为Zend_Form是一个将许多资源和层绑定在一起的特定类.如果您查看Matthews帖子,您会发现这正是在视图脚本上设置操作URL并且表单与模型绑定时所说的内容.

最后,您可以分析您的上下文并选择这两种方法之一.

目前,我的选择是将表单与模型联系起来.看起来不错!对我来说很有意义.