2016-05-23 78 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' 
       ], 
      ) 
     ); 
    } 
} 
相關問題