Symfony形式:使用自定义property_path的字段的错误映射

时间:2016-05-23 21:02:37

标签: forms validation symfony-forms symfony

我遇到使用自定义属性路径定义的字段的错误映射问题。我的情况如下:

表单类型:

class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'aField',
            TextType::class,
            ['property_path' => 'anObject.aProperty']
        );
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([ 'data_class' => FormData::class ]);
    }
}

表单数据类:

class FormData
{
    /**
     * @var MyObject
     * @Assert\Valid
     */
    public $anObject;
}

表单数据嵌套对象:

class MyObject
{
    /**
     * @var string
     * @Assert\NotBlank
     */
    public $aProperty;

    // NOTE: this object has other properties that are not mapped by my form and I'm not listing here for the sake of brevity.
}

我的问题如下:当aProperty发生违规时,违规路径为data.anObject.aProperty,因此错误不会自动映射到aField表单字段。我从“vanilla”验证的角度理解这是正确的,但我希望在表单级别使用某种转换层来调整基于property_path属性的映射,以便将表单错误附加到正确的字段。我尝试了error_mapping选项,但事实并非如此。

我错误地认为这是一种“默认”行为吗?您是否认为这可能被视为一个错误,或者至少是一个值得请求的功能请求?有人与类似的情况有关并找到了解决方案吗?

1 个答案:

答案 0 :(得分:0)

有同样的问题。调查问卷有财产$ user

用户与居住地有一个OneToMany关系。

我必须向用户的第一个问卷类型的Residency提交一些数据,所以我将property_path字段'residency'包含在第一个用户的驻留(user.residencies [0])中。在那之后,我不得不追加根形式(QuestionnaireType)的选项,并使用error_mapping来判断,驻留错误应该转到'驻留'类型('user.residencies'=>'驻留')

以防万一 - 调查问卷实体没有财产“居住”

有我的解决方案:

<?php

class QuestionnaireType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('residency', 'residency', [
                'data_class' => Residency::class,
                'property_path' => "user.residencies[0]",
            ])
        ;
    }

    public function getName()
    {
        return 'questionnaire_form';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            array(
                'data_class' => Questionnaire::class,
                'cascade_validation' => true,
                'error_mapping' => [
                    'user.residencies' => 'residency'
                ],
            )
        );
    }
}