You can also map the same object to multiple merged forms.
$entity = new Form(); $form = $this->get('form.factory')->create(FormType::class, [ 'form_builder' => $entity, 'submit_builder' => $entity, ]);
FormType.php
<?php namespace GenyBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\OptionsResolver\OptionsResolver; use GenyBundle\Entity\Form; class FormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('form_builder', FormBuilderType::class, [ 'data_class' => Form::class, 'label' => false,
FormBuilderType.php
<?php namespace GenyBundle\Form\Type; use GenyBundle\Base\BaseType; use Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class FormBuilderType extends BaseType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('title', Type\TextType::class, [ 'attr' => [ 'placeholder' => 'geny.type.form.title.placeholder', ], 'empty_data' => $this->get('translator')->trans('geny.type.form.title.default', [], 'geny'), 'label' => 'geny.type.form.title.label', 'required' => true, ]) ->add('description', Type\TextareaType::class, [ 'attr' => [ 'placeholder' => 'geny.type.form.description.placeholder', ], 'empty_data' => null, 'label' => 'geny.type.form.description.label', 'required' => false, ]) ; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => 'GenyBundle\Entity\Form', 'translation_domain' => 'geny', ]); } }
SubmitBuilderType.php
<?php namespace GenyBundle\Form\Type; use GenyBundle\Base\BaseType; use Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class SubmitBuilderType extends BaseType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('submit', Type\TextType::class, [ 'attr' => [ 'placeholder' => 'geny.type.submit.submit.placeholder', ], 'empty_data' => $this->get('translator')->trans('geny.type.submit.submit.default', [], 'geny'), 'label' => 'geny.type.submit.submit.label', 'required' => true, ]) ; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => 'GenyBundle\Entity\Form', 'translation_domain' => 'geny', ]); } }
Form.php
<?php namespace GenyBundle\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; use JMS\Serializer\Annotation as Serializer; use Symfony\Component\Validator\Constraints as Assert; class Form { protected $id; protected $title; protected $description; protected $fields; protected $submit; }
Result:
