我以前使用的解决方案是将定义表格配置的数组传递给表单类型的构造方法,并在buildForm方法中构建这些表单字段。
我不知道您如何设置用户,因此有一些空白需要填写。
首先,我认为这将在控制器中发生,但更好的方法是将尽可能多的逻辑移动到类似于FOS用户包的表单处理程序中:
https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Form/Handler/RegistrationFormHandler.php
您需要获取所有用户配置文件字段并准备好添加到表单类型构造函数中的数组(请参见ProfileType的示例)。
$form_config = array(
'fields' => array()
);
然后,您需要根据已收集的用户资料创建一个基于User的数组表示。稍后将使用此数据绑定到表单。
我不确定您是否可以直接将此数组版本传递给表单。如果表单期望实体,则可能需要先将基本用户实体传递给表单,然后再绑定包含动态数据的数组版本(以设置动态字段值)。
这是您将要使用的Profile表单类:
class ProfileType extends AbstractType
{
private $formConfig = array();
public function __construct($form_config = array())
{
$this->formConfig = $form_config;
}
public function buildForm(FormBuilder $builder, array $options)
{
foreach ($this->formConfig['fields'] as $field) {
$options = array('property_path' => false);
$builder->add($field->getField(), $field->getCategory(), $options);
}
}
这涵盖了表单的输出。
在控制器中创建表单。
$profileForm = $this->createForm(new ProfileType($form_config), $user);
总之,控制器方法的结构应该像这样(填写空白部分):
我认为表单事件可能是Symfony2的更好方法,但这可能会帮助您入门。然后在重构阶段可以考虑使用表单事件。