我正在与Symfony 3.4
合作,想知道如何以及何时使用createForm
与createFormBuilder
就我而言,我需要为同一数据类创建两种不同的形式,例如用户对象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
缺点:无法在regUserAction
和regAdminAction
中向创建的表单添加自定义字段吗?
由于需要自定义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 ...)
}
专业版:可以向表单添加自定义字段
缺点:必须为每个表单再次实施表单的通用设置。
是否可以将这两种方法混合使用?要仅实施一次通用表单设置并为每个表单添加自定义字段?
答案 0 :(得分:0)
您可以使用FormEvents在FormType中修改表单,如Symfony文档中所述。有example根据用户数据修改表单。
答案 1 :(得分:0)
也许您可以在服务中实现代码并返回$ formBuilder对象以在操作中对其进行自定义。或者,您可以实现某种工厂模式,并根据传递给它的参数构建$ formBuilder。