代码之家  ›  专栏  ›  技术社区  ›  Peter Smit

Zend_Form在模型-视图-控制器范例中的位置

  •  8
  • Peter Smit  · 技术社区  · 14 年前

    这个 Zend Framework 主要用于MVC。其中一个非常有用的组件是 Zend_Form

    我找不到Zend_表单的位置。它是视图、模型或控制器的一部分,我应该赋予它哪些职责。

    问题是,Zend_Form做了两件事:修饰和呈现表单并验证它。第一个是真正的视图任务,第二个是真正的模型任务。

    另一个选择是 Matthew Weier O'Phinney

    所以,我怀疑。在MVC模式中,我应该将Zend_Form放在哪里,应该如何使用它?

    到目前为止答案不错,谢谢!我会在奖金到期前一两个小时颁发奖金,如果你还有什么想法,请回答!

    3 回复  |  直到 14 年前
        1
  •  5
  •   Keyne Viana    14 年前

    Zend_表单可以在不同的位置查看。它根本不能被看作是MVC模式的一个组成部分。

    首先,Zend_表单使用decorators和view helpers来呈现表单,此时它是视图层的一部分。 然后,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;
        }
    }
    

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

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

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

        2
  •  2
  •   Fatmuemoo    14 年前

    IMO,Zend_Form是为戴多顶帽子而设计的。实际上,它是视图和模型之间的桥梁,控制器提供一个巨大的支撑梁。

    在模型层中,可以有一个getFormInputs方法,该方法可以返回输入数据所需的元素。这个模型并不关心什么形式的应用,它只是让任何想要它的人都可以使用它。

    现在在表单层中,创建一个setupInputs方法,该方法将遍历一个模型数组以获取所有输入。如果只有一个模型,请将输入添加到表单中。如果有多个模型,则生成子表单。

        3
  •  1
  •   Bryan M.    14 年前

    Zendúu Form经常觉得自己是个怪人。我想每个人的里程数都不一样。

    我认为奥菲尼的想法也很有道理。在这里,他选择将表单看作域对象的一个组件,在这里他可以添加业务逻辑。这听起来很好,只要您小心地将窗体的所有视图逻辑分开。正如他所指出的,这是关于语义的。不一定有硬性规定。