Ser5
Ser5

Reputation: 349

Symfony5 forms: how to disable "required" for all fields by default?

Description

Symfony has required = true for all input fields by default: https://symfony.com/doc/current/reference/forms/types/text.html#required

And I'm searching for means to disable this behaviour.

Findings

1. Explicit required=false

Of course, the simplest one is to pass ['required' => false] to each and every field. But this is somewhat unwieldy.

2. Helper class

Then, I created a helper class to build forms tweaked for my needs. It was simply appending ['required' => false] to every field. It works - except for submit button or alike - for them Symfony throws an error:

Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException: The option "required" does not exist. Defined options are: "attr", "attr_translation_parameters", "auto_initialize", ...

I tried to find a way to get the list of available options for fields - but they are well-hidden, failed to uncover them.

3. required=false to the form

I also tried to put ['required' => false] into the very top form. Well... it behaves strangely:

Questions

So, is there a right method to solve the issue? It could be some method() for getting available options for specific fields - so I could skip setting required for fields without it. Or some approach that I don't know about.

Edit 1

Tried the solution written in https://stackoverflow.com/a/65825111/982746

This is my test code:

<?php
require_once __DIR__.'/../../lib/vendor/autoload.php';

use \Symfony\Component\Form\Forms;
use \Symfony\Component\Form\AbstractTypeExtension;
use \Symfony\Component\Form\Extension\Core\Type as T;



class NotRequiredExtension extends AbstractTypeExtension {
    public static function getExtendedTypes (): iterable {
        return [T\FormType::class];
    }

    public function configureOptions ($resolver) {
        $resolver->setDefault('required', false);
    }
}



$builder = Forms::createFormFactoryBuilder()
    ->addTypeExtension(new \NotRequiredExtension())
    ->getFormFactory()
    ->createBuilder(T\FormType::class, ['inherit'=>'', 'required_true'=>'', 'required_false'=>''])
;

$form = $builder
    ->add('inherit',        T\TextType::class)
    ->add('required_true',  T\TextType::class, ['required'=>true])
    ->add('required_false', T\TextType::class, ['required'=>false])
    ->getForm()
;

$formView = $form->createView();

var_dump($formView->children['inherit']->vars['required']); //false
var_dump($formView->children['required_true']->vars['required']); //false
var_dump($formView->children['required_false']->vars['required']); //false

Seems it doesn't work - similar to my experiment #3: if I set required=false to the form type, symfony then refuses to change required to true for any individual field - all of the var_dump()s display false.

Upvotes: 2

Views: 1572

Answers (1)

Hricer
Hricer

Reputation: 613

You can create form extension AbstractTypeExtension.

namespace App\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class NoRequiredExtension extends AbstractTypeExtension
{
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefault('required', false);
    }

    public static function getExtendedTypes(): iterable
    {
        return [FormType::class];
    }
}

Upvotes: 5

Related Questions