如何以及何时使用createForm与createFormBuilder

时间:2019-01-29 14:44:22

标签: forms symfony

我正在与Symfony 3.4合作,想知道如何以及何时使用createFormcreateFormBuilder

就我而言,我需要为同一数据类创建两种不同的形式,例如用户对象User。表单仅在某些其他字段中有所不同。

例如,一种普通用户的注册表格,带有附加字段以接受法律条款,订阅新闻通讯等。另一种管理员用户的注册表格,带有其他一些附加字段。在这两种情况下,都使用相同的User类,并且未映射其他字段:

public function regUserAction(Request $request) {
    // Create and show user reg form
}

public function regAdminAction(Request $request) {
    // Create and show admin reg form
}

由于需要在两个不同的地方使用User表单,因此创建UserFormType并使用createForm创建表单是一个好主意

public function regUserAction(Request $request) {
    $form = $this->createForm(UserFormType::class, $user, array());
}

public function regAdminAction(Request $request) {
    $form = $this->createForm(UserFormType::class, $user, array());
}

class UserFormType extends AbstractType {
    // setup of form fields, FormEvents handlers, etc. 
}

专业版:只需在UserFormType

中实施一次表单设置

缺点:无法在regUserActionregAdminAction中向创建的表单添加自定义字段吗?


由于需要自定义User表单,因此最好使用createFormBuilder

public function regUserAction(Request $request) {
    $formBuilder = $this->createFormBuilder($user, array())
        ->add(... common form setup ...)
        ->add(... custom user fields ...)
}

public function regAdminAction(Request $request) {
    $formBuilder = $this->createFormBuilder($user, array())
        ->add(... common form setup ...)
        ->add(... custom admin fields ...)
}

专业版:可以向表单添加自定义字段

缺点:必须为每个表单再次实施表单的通用设置。


是否可以将这两种方法混合使用?要仅实施一次通用表单设置并为每个表单添加自定义字段?

2 个答案:

答案 0 :(得分:0)

您可以使用FormEvents在FormType中修改表单,如Symfony文档中所述。有example根据用户数据修改表单。

答案 1 :(得分:0)

也许您可以在服务中实现代码并返回$ formBuilder对象以在操作中对其进行自定义。或者,您可以实现某种工厂模式,并根据传递给它的参数构建$ formBuilder。