Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
i needed a form type that determines based on the bound data if it should be required or not (to make file upload required if we create a new entity, but optional when editing the entity with the file. as this happens in a embedded sonata, i have no way of knowing the actual data when creating the form in the form builder. this is what i came up…
class ImageType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
if ($options['required_auto'] && ! $options['required']) {
$builder->addEventListener(\Symfony\Component\Form\FormEvents::PRE_SET_DATA, array($this, 'determineRequired'));
public function setDefaultOptions(OptionsResolverInterface $resolver)
$resolver->setDefaults(array('required_auto' => true, 'required' => false));
public function determineRequired(FormEvent $event)
$data = $event->getData();
$form = $event->getForm();
if (! $data->isNew()) { // my model data knows if it is new or not
$config = $form->getConfig();
$reflection = new \ReflectionClass($config);
$reflection = $reflection->getParentClass();
$prop = $reflection->getProperty('required');
$prop->setValue($config, true);
Copy link

This might be a rather old problem but is still valid.

Altering the options of a form type based on its data still doesn't seem possible without hacks such as this.

Copy link

mik-laj commented Dec 30, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment