Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Zend framework2 如何在Zend framework 2中填充表单选择模型_Zend Framework2_Zend Form - Fatal编程技术网

Zend framework2 如何在Zend framework 2中填充表单选择模型

Zend framework2 如何在Zend framework 2中填充表单选择模型,zend-framework2,zend-form,Zend Framework2,Zend Form,这个问题我以前问过。但问题/解决方案要么与使用fieldset相关,要么更老,并且使用ZF2早期版本中的技术。现在我知道了。但有一种解决方案与使用FormElementManager将字段集绑定到表单相关。对于大多数最近的问题重新分级创建动态表单下拉列表也是如此 但我有一个表单,它有3个下拉字段,从DB中获取数据。到目前为止,我可以选择将DB适配器从控制器传递给表单的构造函数。但现在我想使用更好的方法来填充下拉列表,最好是FormElementManager,但不使用字段集 如果真的有可能构建这

这个问题我以前问过。但问题/解决方案要么与使用fieldset相关,要么更老,并且使用ZF2早期版本中的技术。现在我知道了。但有一种解决方案与使用FormElementManager将字段集绑定到表单相关。对于大多数最近的问题重新分级创建动态表单下拉列表也是如此

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


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

您可以通过工厂注入DB适配器依赖性。以下配置将位于Module.php内或配置文件中。您可以插入DB适配器或objectManager,并从应用程序中任何支持service manager的类中的service manager其他位置检索表单对象

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适配器依赖性已通过工厂注入

从控制器中访问对象时,您可能需要考虑创建一个控制器插件,以将Service MaMaGER对象保持在控制器类之外。

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

这将不起作用,因为所有表单元素初始化都是在第一个调用的构造函数中完成的。因此,数据库适配器未在该时间设置。因此,代码将抛出错误。您可以用同样的方法在表单构造函数中轻松传递DB适配器,请参见上面编辑的答案:$form=new\MyNamespace\MyForm($sm->get('my_DB_adapter');这种方法是可行的,但这里有一个警告,我需要传递模型,而不是DB适配器作为代码质量要求。然后As表单需要更多的动态下拉列表,因为构造函数有更多的参数(比如
u构造(ModelA,ModelB,ModelC,ModelD)
),它们看起来很难看。在数组中传递它们也有同样的丑陋程度。如果我传递ServiceManager并将模型实例放入模型中会怎么样呢?您只询问了DB适配器,所以我的示例演示了如何做到这一点。我不知道为什么你会想通过很多,如果个人模型像这样。当然,在DBAdapter中,您可以从表单中查询相关的存储库,或者使用其中的逻辑创建一个自定义的Select对象。例如,如果您要使用Doctrine ORM,您可以使用ObjectSelect:这是一个自定义表单元素,在您的DB存储库中,它通过代理扩展Select并填充选项