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

时间:2011-04-07 15:55:59

标签: php model-view-controller zend-framework forms

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

3 个答案:

答案 0 :(得分:1)

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

例如在您的控制器中:

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

答案 1 :(得分:1)

你可能想看看Matthew Weier O'Phinney的Using Zend_Form in Your Models。它解释了如何将这种逻辑从控制器转移到模型中。

答案 2 :(得分:0)

对于数据库表,您应该创建模型 - 这些模型应该包含获取和设置数据到该表的逻辑。所以在这个例子中,模型应该负责获取一个值数组,然后传递给控制器​​然后传递给表单。

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;
}