2010-10-21 64 views
8

Zend Framework主要用于MVC使用。其中一个非常有用的组件是Zend_FormZend_Form在哪里适合模型视图控制器范例

找到Zend_Form的位置有点麻烦。它是视图,模型还是控制器的一部分,我应该承担哪些责任。

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

现在最常见的用法似乎是将表单与控制器进行交互,将两个任务(渲染和验证)有效地放到视图/控制器中。

Matthew Weier O'Phinney给出的另一个选项是将窗体附加到您的模型,并在控制器中添加稍后的视图选项。

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

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

回答

5

Zend_Form可以在不同的点查看。它完全不能被视为MVC模式的一部分。

首先,Zend_Form使用装饰器和视图助手来渲染窗体,此时它是视图层的一部分。 然后,Zend_Form完成模型作业的一部分过滤并验证内容。

我们知道Controller层从视图渲染输入并将其传递给模型。实际上,控制器层决定从模型层加载哪个资源,然后执行更正呼叫。

当您从控制器层调用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; 
    } 
} 

从标准的目录结构,我们可以看到,表单是不是模型文件夹中,也没有在视图文件夹,因为Zend_Form的是,配合大量资源,各层连接在一起的特定类。如果你检查Matthews文章,你会意识到,这正是当在视图脚本上设置动作URL并且表单与模型绑定时所说的内容。

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

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

1

Zend_Form通常会觉得自己很奇怪。我认为每个人的里程都不一样。最近,我的大多数管理界面都非常拖拽AJAX-y,并且他们需要大量的html和javascript - 实际的表单元素很稀疏。所以我选择了避开Zend_Form的许多特性,并将其用作过滤的幻想视图助手。我所有的验证都是在模型中的一个单独的层上完成的。

我认为O'Phinney的想法也很有意义。在这里,他选择将表单视为域对象的组成部分 - 他可以在其中添加业务逻辑。这听起来很好,只要你小心地保持表单的所有视图逻辑分离。正如他所指出的那样,这是关于语义的。不一定是硬性规定。

2

国际海事组织,Zend_Form旨在穿多个帽子。事实上,它是一个视角与模型之间的桥梁,并带有来自控制器的巨大支撑梁。

不要将表单分配给模型,而应考虑将模型分配给表单。

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

现在在表单图层中,创建一个setupInputs方法,该方法将通过一系列模型循环以获取所有输入。如果只有一个模型,请将输入添加到表单。如果有多个模型,则创建子表单。

您的控制器将启动表单并将值传递回模型(请参阅Keyne的newAction方法)