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