代码之家  ›  专栏  ›  技术社区  ›  Andrei Herford

如何以及何时使用createForm与createFormBuilder

  •  0
  • Andrei Herford  · 技术社区  · 7 年前

    Symfony 3.4 createForm createFormBuilder

    在我的例子中,我需要为同一个数据类创建两种不同的形式,例如用户对象 User . 表格仅在一些附加字段中有所不同。

    例如,一份普通用户的注册表,包含接受法律条款、订阅时事通讯等的附加字段;一份管理员用户的注册表,包含其他一些附加字段。在这两种情况下相同 类,但未映射其他字段:

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

    使用者 在两个不同的地方需要/使用表单。最好创建一个 UserFormType 并使用 创建表单

    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. 
    }
    

    赞成 :表单的设置只需在中执行一次

    反对的论点: regUserAction 和 regAdminAction


    使用者 表单需要定制,最好使用 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 回复  |  直到 7 年前
        1
  •  1
  •   Benjamin Kozlowski    7 年前

    您可以使用FormEvents在FormType中修改表单,如Symfony文档中所述。有一个 example

        2
  •  0
  •   Zak    7 年前

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