Inherit form or add type to each form Inherit form or add type to each form symfony symfony

Inherit form or add type to each form


Have you tried using inheritance?

This is really simple, first you have to define a form type:

# file: Your\Bundle\Form\BaseType.php<?phpnamespace Your\Bundle\Form\Type;use Symfony\Component\Form\AbstractType;use Symfony\Component\Form\FormBuilderInterface;use Symfony\Component\OptionsResolver\OptionsResolverInterface;class BaseType extends AbstractType{    public function buildForm(FormBuilderInterface $builder, array $options)    {        $builder->add('name', 'text');        $builder->add('add', 'submit');    }    public function setDefaultOptions(OptionsResolverInterface $resolver)    {        $resolver->setDefaults(array(            'data_class' => 'Your\Bundle\Entity\YourEntity',        ));    }    public function getName()    {        return 'base';    }}

Then you can extend this form type:

# file: Your\Bundle\Form\ExtendType.php<?phpnamespace Your\Bundle\Form\Type;use Symfony\Component\Form\AbstractType;use Symfony\Component\Form\FormBuilderInterface;use Symfony\Component\OptionsResolver\OptionsResolverInterface;class ExtendType extends BaseType{    public function buildForm(FormBuilderInterface $builder, array $options)    {        parent::buildForm($builder, $options);        # you can also remove an element from the parent form type        # $builder->remove('some_field');        $builder->add('number', 'integer');    }    public function setDefaultOptions(OptionsResolverInterface $resolver)    {        $resolver->setDefaults(array(            'data_class' => 'Your\Bundle\Entity\YourEntity',        ));    }    public function getName()    {        return 'extend';    }}

The BaseType will display a name field and an add submit button. The ExtendType will display a name field, an add submit button and a number field.


You can do this with the getParent() function.

<?phpnamespace Your\Bundle\Form;use Symfony\Component\Form\AbstractType;use Symfony\Component\Form\FormBuilderInterface;class ChildType extends AbstractType{    public function buildForm(FormBuilderInterface $builder, array $options)    {        // $builder->remove('field');        // $builder->add('field);    }    public function getParent()    {        return ParentType::class;    }}