Php 如何在Symfony中使表单模块化?

Php 如何在Symfony中使表单模块化?,php,forms,symfony,Php,Forms,Symfony,我在一个页面中有10个表单(它们在选项卡页面中) 我的控制器功能非常强大,为了使表单模块化,我计划只在控制器功能中显示表单,并向相应的控制器发送帖子 这10个表单中的一些在其他页面中使用,因此通过更改操作url,可以更轻松地在单独的控制器中管理它们 但是,如果表单无效,我将如何显示表单错误并阻止表单重置 如果嵌入式控制器可以重定向,我可以实现这一点。我是否错过了另一个选择 Symfony2必须有理由不允许在嵌入式控制器中进行重定向,但我想知道为什么 第三次编辑: 实际形式的图像: 图1:Step

我在一个页面中有10个表单(它们在选项卡页面中)

我的控制器功能非常强大,为了使表单模块化,我计划只在控制器功能中显示表单,并向相应的控制器发送帖子

这10个表单中的一些在其他页面中使用,因此通过更改操作url,可以更轻松地在单独的控制器中管理它们

但是,如果表单无效,我将如何显示表单错误并阻止表单重置

如果嵌入式控制器可以重定向,我可以实现这一点。我是否错过了另一个选择

Symfony2必须有理由不允许在嵌入式控制器中进行重定向,但我想知道为什么

第三次编辑:

实际形式的图像:

  • 图1:Step1(只能创建一次)
  • 图2:Step5(可以多次创建)您可以看到创建表单和编辑表单
  • 图3:Step5用户界面表单向上滑动
  • 图4:步骤6与步骤1相同
  • 这些表单不需要按顺序排列,用户可以创建并保存步骤6,而无需创建步骤1

    第二次编辑:

    这不是一个多步骤表单。为了方便起见,我把它们命名为
    Step1
    Step2
    ,等等

    编辑:

    这就是我所拥有的:

    class DefaultController extends Controller{
        public function processAction(){
            $request = $this->getRequest();
            /*** FORM 1 ****/
            $entity  = new Step1();
            $form1   = $this->createForm(new Step1Type(), $entity);
            if ($request->getMethod() == 'POST'){
                $form1->bindRequest($request);
                if($form1->isValid()){
                    return $this->redirect($this->generateUrl('some_link'));
                }
            }
            /***/
            //Do the same for other forms
    
            return array(
                'form1'   => $form1->createView()
                //[...to form10]
            );
        }
    }
    
    这就是我想要的:(我可以使用嵌入式控制器,但不能重定向)


    我想出了4个解决方案,从最好的到最坏的顺序是:

  • 阿贾克斯
  • 嵌入式控制器中没有重定向
  • 如果表单无效,则在会话中保存已发布的数据/表单错误
  • 修改Symfony2内部构件以允许从嵌入式控制器重定向
  • AJAX

    这实际上是最好的,因为它减少了整个页面的请求,并且是高度模块化的

    您将呈现所有10个嵌入式控制器,但每个submit按钮将执行指向相应控制器的ajax post,该控制器将只处理相应的表单,并且只返回该特定表单的视图

    而且,您不需要对javascript感兴趣,因为您只需要在单击submit并将响应加载到表单所在的div时进行AJAX调用


    嵌入式控制器中无重定向

    问题是,如果用户按F5,它将重新发送POST数据


    在表单无效的情况下保存会话中发布的数据/表单错误

    修改Symfony2内部,以允许从嵌入式控制器重定向


    这两个选项不太可取,因为它会造成复杂性。

    @AndrzejOśmiałowski我发布了我的代码。我把它编辑得更短。你的表格(整个表格)是一种
    step类型的表格吗?@AndrzejOśmiałowski不,它们被命名为
    step
    ,但它们来自完全不同的实体。我不能将其设置为多步骤表单,因为某些步骤是重复的(用户可以创建一个
    步骤
    实体的多个实例)。让我问另一个问题:每个表单的职责是什么?@AndrzejOśmiałowski创建/编辑实体,然后将其应用于数据库。对于一些实体,我必须调用额外的方法,比如,
    $step1->setSomething($getSomething)
    ,它是最小的,但是当你将这些最小的调用乘以10,你就会得到一个大函数。另外,如果我需要使用完全相同的表单,那么我希望能够创建表单并让相应的管理员处理帖子。我仍然认为这可能是一个设计问题;)AJAX解决方案看起来不错,因为它允许您使用表单事件,这在许多情况下可能会有所帮助。
    class DefaultController extends Controller{
        public function processAction(){
            $request = $this->getRequest();
            /*** FORM 1 ****/
            $entity  = new Step1();
            $form1   = $this->createForm(new Step1Type(), $entity);
            //change $form1 action url to point to Step1Controller->createAction()
            /***/
            //Do the same for other forms
    
            return array(
                'form1'   => $form1->createView()
                //[...to form10]
            );
        }
    }
    class Step1Controller extends Controller{
        public function createAction(){
            $request = $this->getRequest();
    
            $entity  = new Step1();
            $form   = $this->createForm(new Step1Type(), $entity);
    
            $form->bindRequest($request);
            if($form->isValid()){
                //save entity
                return $this->redirect($this->generateUrl($getRedirectLinkFromForm));
            }
            return $this->redirect($this->generateUrl('some_other_link')); 
        }
    }