Symfony 提交多个相关表单

Symfony submit multiple related forms

我想创建一个包含多个实体和多个表单的 CRUD。 A 想创建一个站点,创建时每个站点需要有 1 个地址,每个地址需要 1 个城市,每个城市需要 1 个国家

所以我有一个控制器,我在其中调用了 Type

/**
    * @Route("admin/sites/new", name="admin.sites.new")
    * @param Request $request
    * @return RedirectResponse|Response
    */
   public function new (Request $request)
   {
       $site = new Site();
       $adresse = new Adresse();
       $ville = new Ville();
       $pays = new Pays();
       $form = $this->createForm(SiteType::class, $site);
       $form2 = $this->createForm(AdresseType::class, $adresse);
       $form3 = $this->createForm(VilleType::class, $ville);
       $form4 = $this->createForm(PaysType::class, $pays);
       $form->handleRequest($request);
       $form2->handleRequest($request);
       $form3->handleRequest($request);
       $form4->handleRequest($request);

       if ($form->isSubmitted() && $form->isValid()
           && $form2->isSubmitted() && $form2->isValid()
           && $form3->isSubmitted() && $form3->isValid()
           && $form4->isSubmitted() && $form4->isValid()){
           $this->em->persist($site);
           $this->em->persist($adresse);
           $this->em->persist($ville);
           $this->em->persist($pays);
           $this->em->flush();
           $this->addFlash('success', 'Site crée avec succès');
           return $this->redirectToRoute('admin.sites.index');
       }
       return $this->render('admin/sites/create.html.twig', [
           'site' => $site,
           'adresse' => $adresse,
           'ville' => $ville,
           'pays' => $pays,
           'form' => $form->createView(),
           'form2' => $form2->createView(),
           'form3' => $form3->createView(),
           'form4' => $form4->createView(),
       ]);
   }

和生成视图的 Twig。

    <div class="row">
        <div class="col s12 m12 l12">
            <div class="card-panel ">
                <div class="row">

                    {{ form_start(form) }}
                        {{ form_widget(form) }}


                    {{ form_start(form2) }}
                    {{ form_widget(form2) }}

                    {{ form_start(form3) }}
                    {{ form_widget(form3) }}

                    {{ form_start(form4) }}
                    {{ form_widget(form4) }}

                    <button class="btn s12 m6 l3">{{ button|default('Enregister') }}</button>
                    {{ form_end(form) }}{{ form_end(form2) }}{{ form_end(form3) }}{{ form_end(form4) }}
                </div>
            </div>
        </div>
    </div>

我的下一个问题是,当我创建我的网站时,我如何 link site_id 和 address_id 等等 adress_id 和 city_id、city_di 和国家 _id ?没有分开我的表格? 我的意思是当我按下按钮时,关系将被正确创建。

谢谢你的帮助。

您应该使用嵌入形式:https://symfony.com/doc/current/form/embedded.html

这是您应该并且可以实现的方式: 您应该使用嵌入形式 How to Embed Forms

您只需为您的实体创建表单类型:SiteType、AdresseType、VilleType、PaysType并像下面这样嵌入它们

// in SiteType
    //....
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('adresse', AdresseType::class)
         ;
    }
// in AdresseType
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('ville', VilleType::class)
         ;
    }
// in VilleType
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('pays', PaysType::class)
         ;
    }

最后在你的控制器中,你所要做的就是创建

   /**
    * @Route("admin/sites/new", name="admin.sites.new")
    * @param Request $request
    * @return RedirectResponse|Response
    */
   public function new (Request $request)
   {
       $site = new Site();
       $form = $this->createForm(SiteType::class, $site);
       $form->handleRequest($request);

       if ($form->isSubmitted() && $form->isValid()
           $this->em->persist($site);
           $this->em->flush();
           $this->addFlash('success', 'Site crée avec succès');

           return $this->redirectToRoute('admin.sites.index');
       }

       return $this->render('admin/sites/create.html.twig', [
           'site' => $site,
           'adresse' => $adresse,
           'ville' => $ville,
           'pays' => $pays,
           'form' => $form->createView(),
       ]);
   }

相应的树枝是:

    <div class="row">
        <div class="col s12 m12 l12">
            <div class="card-panel ">
                <div class="row">
                    {{ form_start(form) }}
                        {{ form_widget(form) }}

                        <button class="btn s12 m6 l3">{{ button|default('Enregister') }}</button>
                    {{ form_end(form) }}
                </div>
            </div>
        </div>
    </div>

请注意,为了使其正常工作,您需要在实体学说元数据中使用级联,如下所示:

/**
 * @ORM\OneToOne(targetEntity="AppBundle:Adresse", cascade={"all"})
 */
private $adresse;