【问题标题】:Zend_Form / MVC, where should form preparation and processing take place?Zend_Form / MVC,表单准备和处理应该在哪里进行?
【发布时间】:2011-04-07 15:55:58
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    例如在您的控制器中:

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

    【讨论】:

    • 嘿丹尼尔,谢谢您的回复。您的表单处理是否还负责在相关模型上设置属性并将其持久化?
    • 是的,这样表格是可移植的。知道所有表单逻辑都包含在该单独的表单类中,因此可以轻松更改加载在多个页面上的表单。
    【解决方案2】:

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

    【讨论】:

    • 嗨,维卡,感谢您的回复。我读了你链接的那篇文章。让我担心的是作者有save()之类的模型方法。我认为普遍的共识是模型不应该对持久性手段有任何想法?
    【解决方案3】:

    您应该为您的数据库表创建模型 - 这些模型应该包含获取数据并将数据设置到该表中的逻辑。所以在这种情况下,模型应该负责获取一个值数组,然后将其传递给控制器​​,然后再传递给表单。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2011-01-30
      • 2010-12-06
      • 2017-05-06
      • 2023-04-02
      • 1970-01-01
      • 2019-04-06
      相关资源
      最近更新 更多