Php Zend_Form/MVC,表格准备和处理应在哪里进行?
我目前在控制器中有代码,它从数据库中检索3种类型的实体,以便填充3个选择字段。控制器还负责调用form objects validate方法,一旦成功,它将从表单输入实例化和设置实体的属性,并调用数据映射器将其持久化。我觉得我的控制器太胖了。关于我应该把表格准备和处理代码放在哪里有什么建议吗?我应该把它移到表单对象中吗?提前谢谢你的时间 我更喜欢将表单处理放在表单本身中。因此,我在表单中创建了一个process()方法,这样您就可以将所有表单逻辑封装在表单对象中 例如,在控制器中: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
$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()等模型方法。我认为普遍的共识是,模型不应该对持久性的方法有任何概念?