Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend_Form/MVC,表格准备和处理应在哪里进行?_Php_Model View Controller_Zend Framework_Forms - Fatal编程技术网

Php Zend_Form/MVC,表格准备和处理应在哪里进行?

Php Zend_Form/MVC,表格准备和处理应在哪里进行?,php,model-view-controller,zend-framework,forms,Php,Model View Controller,Zend Framework,Forms,我目前在控制器中有代码,它从数据库中检索3种类型的实体,以便填充3个选择字段。控制器还负责调用form objects validate方法,一旦成功,它将从表单输入实例化和设置实体的属性,并调用数据映射器将其持久化。我觉得我的控制器太胖了。关于我应该把表格准备和处理代码放在哪里有什么建议吗?我应该把它移到表单对象中吗?提前谢谢你的时间 我更喜欢将表单处理放在表单本身中。因此,我在表单中创建了一个process()方法,这样您就可以将所有表单逻辑封装在表单对象中 例如,在控制器中: $form

我目前在控制器中有代码,它从数据库中检索3种类型的实体,以便填充3个选择字段。控制器还负责调用form objects validate方法,一旦成功,它将从表单输入实例化和设置实体的属性,并调用数据映射器将其持久化。我觉得我的控制器太胖了。关于我应该把表格准备和处理代码放在哪里有什么建议吗?我应该把它移到表单对象中吗?提前谢谢你的时间

我更喜欢将表单处理放在表单本身中。因此,我在表单中创建了一个process()方法,这样您就可以将所有表单逻辑封装在表单对象中

例如,在控制器中:

$form = myForumClass();
...
$form.process();

你可能想看看Matthew Weier O'Phinney的作品。它解释了如何将此类逻辑从控制器移动到模型中。

对于数据库表,您应该创建模型-这些模型应该包含获取数据并将数据设置到该表中的逻辑。因此,在本例中,模型应该负责获取一个值数组,然后将其传递给控制器,然后再传递给表单

class MyModel 
{
    public function getSelectArray()
    {
        //Get stuff from Db here and format into an array ready to add to the form
    }
}
然后可以在控制器中执行此操作

$model =  new MyModel();

$element->addMultiOptions($model->getSelectArray());
您还可以创建一个扩展
Zend_form
的特定表单类,然后可以从任何控制器调用该类并返回相同的表单-允许您在任何地方轻松重用表单-例如,您可能希望在注册页面上使用与我的个人资料页面上相同的表单

作为一个例子,下面是我的一个模型中的一个函数,用于实现这一点:

public function getSelectArray()
{
    $select = $this->select()->order(array("name ASC"));

    $categories = $select->query()->fetchAll();

    $return = array();

    foreach($categories as $category)
        $return[$category['id']] = $category['name'];

    return $return;
}

嗨,丹尼尔,谢谢你的回复。表单处理是否也负责在相关模型上设置属性并持久化它们?是的,这样表单是可移植的。使对加载到多个页面上的表单进行更改变得很容易,因为知道所有表单逻辑都包含在单个表单类中。嘿,Vika,感谢您的回复。我读了你链接的那篇文章。我关心的是,作者有save()等模型方法。我认为普遍的共识是,模型不应该对持久性的方法有任何概念?