2016-05-23 87 views
1

我对使用自定义属性路径定义的字段的错误映射有问题。我的情况如下: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选项杂耍,但事实证明这不是它制造的。

我错在期待这种“默认”行为?你认为这可能被认为是一个错误,或者至少是一个值得请求的功能请求?有人需要处理类似的情况并找到解决方案吗?

+0

什么是'aField'?它是否映射'anObject'或不?似乎并不清楚。 – DonCallisto

+0

正如您在下面的类中看到的那样,'aField'映射到'anObject'的'aProperty',它本身就是表单data类的一个属性。 –

+0

被映射...在哪里?我没有在你的类中看到任何'aField' :)这就是我的意思 – DonCallisto

回答

0

有同样的问题。问卷具有属性$用户

用户与居民有一对多关系。

我不得不提交一些数据给用户的第一居住在调查问卷类型,所以我包含field'resident'与property_path到第一个用户的驻留(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' 
       ], 
      ) 
     ); 
    } 
} 
相关问题