gpt4 book ai didi

model-view-controller - Zend_Form 在 Model View Controller 范式中的位置

转载 作者:行者123 更新时间:2023-12-04 07:45:07 25 4
gpt4 key购买 nike

Zend Framework主要用于 MVC 使用。非常有用的组件之一是Zend_Form .

我很难找到 Zend_Form 的位置。它是 View 、模型还是 Controller 的一部分,我应该赋予它哪些职责。

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

现在最常见的用途似乎是让表单仅与 Controller 交互,有效地将两个任务(渲染和验证)放到 View / Controller 中。

Matthew Weier O'Phinney 给出的另一个选项是将表单附加到您的模型,并在 Controller 中添加以后的 View 选项。

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

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

最佳答案

Zend_Form 可以在不同的地方查看。它根本不能被视为仅一层 MVC 模式的一部分。

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

我们知道 Controller 层渲染来自 View 的输入并将其传递给模型。实际上, Controller 层决定从模型层加载哪个资源,然后执行正确的调用。

当您从 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;
}

将表单绑定(bind)到模型可以被认为是一种很好的做法,因为当您执行过滤和验证操作时,您是在模型层上。因此,正如马修所提议的:
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 既不在模型文件夹中,也不在 View 文件夹中,因为 Zend_Form 是一个将许多资源和层联系在一起的特定类。如果您查看 Matthews 的帖子,您会发现这正是在 View 脚本上设置操作 url 并且表单绑定(bind)到模型时所说的内容。

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

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

关于model-view-controller - Zend_Form 在 Model View Controller 范式中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3987532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com