【问题标题】:Validations Groups doesn't working with forms验证组不适用于表单
【发布时间】:2021-11-10 08:08:09
【问题描述】:

我正在尝试在我的 symfony 项目上设置组验证。 当我更新一个实体时,我只需要验证一些字段。当我创建一个实体时,我只需要验证一些其他的字段。

服务:

$form = $this->formFactory->createNamed('form', FormType::class, $entity, ['validation_groups' => ['update']]);

表格:

class FormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('user', EntityType::class, [
                'class' => User::class,
                'validation_groups' => ['create']
            ])
            ->add('number', EntityType::class, [
                'class' => Numbers::class,
                'validation_groups' => ['create', 'update']
            ])
            ->add('phone', TextType::class, [
                'validation_groups' => ['create', 'update']
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Phones::class,
            'allow_extra_fields' => true,
            'validation_groups' => ['create', 'update'],
            'cascade_validation' => true,
        ]);
    }
}

但是,当我提交表单时,“用户”字段仍然有效。

{"form":{"user":748,"number":"9.2","phone":"0x xx xx xx xx"}}

{"id":957,"error":"Expected argument of type \"App\\Entity\\User\", \"null\" given at property path \"user\"."}

【问题讨论】:

    标签: symfony symfony-forms symfony-validator


    【解决方案1】:

    您无需在字段上指定validation_groups。 默认情况下,传递到表单选项的组应用于所有字段。

    # Service 1
    // Only 'create' group will be validated
    $this->formFactory->createNamed('form', FormType::class, $entity, ['validation_groups' => ['create']]);
    
    # Service 2
    // Only 'create' and 'update' group will be validated
    $this->formFactory->createNamed('form', FormType::class, $entity, ['validation_groups' => ['create', 'update']]);
    
    # Form
    class FormType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('user', EntityType::class, [
                    'class' => User::class,
                    // 'validation_groups' => ['create']
                ])
                ->add('number', EntityType::class, [
                    'class' => Numbers::class,
                    // 'validation_groups' => ['create', 'update']
                ])
                ->add('phone', TextType::class, [
                    // 'validation_groups' => ['create', 'update']
                ])
            ;
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => Phones::class,
                'allow_extra_fields' => true,
                // 'validation_groups' => ['create', 'update'],
                'cascade_validation' => true,
            ]);
        }
    }
    

    但是,这看起来不像是表单验证错误(违规)。 Expected argument of type \"App\\Entity\\User\", \"null\" given at property path \"user\" 表示,传递给“用户”字段的值为空(未设置)。 当表单用于“创建”时,您应该省略“用户”字段。

    解决方案一:

    // add option 
    $resolver->setDefaults([
        'data_class' => Phones::class,
        // ...
        'addUserField' => null,
    ]);
    
    // in service pass this option
    $this->formFactory->createNamed('form', FormType::class, $entity, [
       'validation_groups' => ['create'],
       'addUserField' => true
    ]);
    
    // use condition in form to add field only if option is passed with true value
    if($options['addUserField'] === true) {
        $builder->add('user', EntityType::class, [class' => User::class]);
    }
    $builder
       ->add('number'/** ... */)
       ->add('phone'/** ... */)
    ;
    

    解决方案 2:

    创建 2 种表单类型 FormTypeCreateFormTypeUpdate。跳过FormTypeUpdate 中的“用户”字段。您也可以从 FormTypeUpdate 扩展 FormTypeCreate

    class FormTypeUpdate extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('number', EntityType::class, [
                    'class' => Numbers::class,
                ])
                ->add('phone', TextType::class)
            ;
        }
        //...
    }
    
    //
    class FormTypeCreate extends FormTypeUpdate
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('user', EntityType::class, [
                'class' => User::class,
            ])
            parent::buildForm($builder, $options); // adds 'number' and 'phone' fields
        }
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 2018-10-01
      • 2019-08-29
      • 2018-09-07
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多