【问题标题】:How to populate a Form Select from Model in Zend framework 2如何在 Zend 框架 2 中从模型中填充表单选择
【发布时间】:2014-09-05 06:29:02
【问题描述】:

这个问题之前问过。但是与使用 fieldset 相关的问题/解决方案或者它们较旧并使用 ZF2 早期版本中的技术。现在我知道 http://framework.zend.com/manual/2.3/en/modules/zend.form.advanced-use-of-forms.html 。但是那里的解决方案与使用 FormElementManager 将字段集绑定到表单有关。对于最近的大多数问题重新评分创建动态表单下拉菜单也是如此。

但我有一个包含 3 个从数据库获取数据的下拉字段的表单。到目前为止,我可以选择将 DB 适配器从 Controller 传递给 Form 的构造函数。但现在我想使用更好的方法来填充下拉列表,最好是 FormElementManager,但不使用 Fieldsets。

如果真的有可能建立这样的系统?

【问题讨论】:

    标签: zend-framework2 zend-form


    【解决方案1】:

    您可以通过工厂注入数据库适配器依赖项。以下配置将在您的 Module.php 或配置文件中。您可以注入您的 DB 适配器或 objectManager,并从任何服务管理器感知类的应用程序中其他地方的服务管理器检索您的表单对象。

    public function getFormElementConfig()
        {
            return array(
    
                'factories' => array(
                    'MyForm' => function (ServiceManager $sm)
                    {
                        $form = new \MyNamespace\MyForm($sm->get('my_db_adapter'));
                        return $form;
                    },
                       )
        }
    

    此表单现在可通过任何服务感知类的服务定位器获得:

    $serviceLocator->get('FormElementManager')->get('MyForm');
    

    已经通过工厂注入了 DB Adapter 依赖项。

    要从控制器访问对象,您可能需要考虑创建一个控制器插件以将 ServiceManager 对象排除在控制器类之外。

    //MyController.php
    public function myAction(){
    //retrieve form via plugin with the DB adapter already set
    $myForm=$this->myForm();
    }
    

    【讨论】:

    • 这不起作用,因为所有表单元素初始化都在首先调用的构造函数中完成。所以那个时候没有设置DB Adapter。所以代码会抛出错误。
    • 您可以以相同的方式轻松地在表单构造函数中传递您的数据库适配器,请参见上面的编辑答案: $form = new \MyNamespace\MyForm($sm->get('my_db_adapter'));
    • 这种方法可行,但需要注意的是,我需要根据代码质量要求传递模型而不是数据库适配器。然后由于表单需要更多动态下拉菜单,因为构造函数有更多参数(如__construct(ModelA, ModelB, ModelC, ModelD)),看起来很难看。在数组中传递它们也有同样的丑陋程度。
    • 如果我通过 ServiceManager 并将模型实例放入模型中会怎样。
    • 您只询问了数据库适配器,所以我的示例显示了如何做到这一点。如果像这样的个别模型,我不确定你为什么要通过很多。当然,您可以从您的 DBAdapter 中查询相关的存储库,或者使用那里的逻辑创建一个自定义选择对象。例如,如果您要使用 Doctrine ORM,您可以使用 ObjectSelect:github.com/doctrine/DoctrineModule/blob/master/src/… 这是一个自定义 Form 元素,扩展 Select 并通过代理填充选项,在您的情况下为 DB 存储库
    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2012-09-02
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多